为什么即使我将过期设置为 null,JWT 也包含 EXP 声明?



我需要不朽的JWT令牌。当然,我可以将一些大值设置为过期,但我更喜欢在我的令牌中根本没有exp声明。标准的.net核心CreateEncodedJwt允许在expires,notBefore,issuedAt中传递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

这是它内部的样子:

{ "类型 1": "值 1", "类型 2": "值 2", "NBF":1565429366, "exp": 1565432966, "IAT":1565429366 }

请帮助摆脱nbf,exp,iat。提前感谢!

创建令牌的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 进行处理。

它的值必须是数字 包含数字日期值。 使用此声明是可选的。

因此,JWT 格式验证器的所有正确实现都应该成功验证令牌,而无需在该声明中。

最新更新