我需要永生的JWT令牌。当然,我可以为Expires设置一些较大的值,但是我更希望令牌中完全没有exp声明。标准.net核心CreateEncodedJwt允许在null到期之前(而不是beforeAt)传递null。我为所有这些参数传递null,并且我的令牌包含exp令牌(+1小时)。这是怎么回事?!
var securityKey = new SymmetricSecurityKey(Encoding.ASCII.GetBytes("FF804E8A-2A0E-4F94-A6F5-8325822F8DF5"));
var claims = new List<Claim>
{
new Claim("type1", "value1"),
new Claim("type2", "value2")
};
var token = new JwtSecurityTokenHandler().CreateEncodedJwt(
issuer: null,
audience: null,
subject: new ClaimsIdentity(claims),
notBefore: null,
issuedAt: null,
expires: null,
signingCredentials: new SigningCredentials(securityKey, SecurityAlgorithms.HmacSha256));
这是用于解析的工具:https://jwt.io
这是我的令牌:eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ0eXBlMSI6InZhbHVlMSIsInR5cGUyIjoidmFsdWUyIiwibmJmIjoxNTY1NDI5MzY2LCJleHAiOjE1NjU0MzI5NjYsImlhdCI6MTU2NTQyOTM2Nn0.UvJiOQNO_yMzdenf5jAotPHj7zrcEUApraezzcVSicA
这是里面的样子: { “ type1”:“ value1”, “ type2”:“ value2”, “ nbf”:1565429366, “ exp”:1565432966, “ iat”:1565429366 }
请帮助摆脱nbf,exp,iat。预先感谢!
答案 0 :(得分:2)
创建令牌的JwtSecurityTokenHandle
代码的简化版本包含下一部分:
if (SetDefaultTimesOnTokenCreation &&
(!expires.HasValue || !issuedAt.HasValue || !notBefore.HasValue))
{
DateTime now = DateTime.UtcNow;
if (!expires.HasValue)
expires = now + TimeSpan.FromMinutes(TokenLifetimeInMinutes);
if (!issuedAt.HasValue)
issuedAt = now;
if (!notBefore.HasValue)
notBefore = now;
}
因此,您基本上必须将SetDefaultTimesOnTokenCreation
设置为false。 JWT的标准对空的exp
声明没有任何说明:
“ exp”(失效时间)声明标识了的失效时间 或之后不得接受JWT进行处理。
其值必须为数字 包含一个NumericDate值。使用此声明是可选的。
因此,所有正确的JWT格式验证程序实现都应成功验证令牌,而无需在内部声明该声明。