即使我将 Expires 设置为 null,为什么 JWT 仍包含 EXP 声明?

Tim*_*der 6 c# jwt asp.net-core

我需要不朽的 JWT 令牌。当然,我可以为 Expires 设置一些大的值,但我更喜欢在我的令牌中根本没有 exp 声明。标准.net core 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));
Run Code Online (Sandbox Code Playgroud)

这是解析工具: https: //jwt.io

这是我的令牌:

eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ0eXBlMSI6InZhbHVlMSIsInR5cGUyIjoidmFsdWUyIiwibmJmIjoxNTY1NDI5MzY2LCJleHAiOjE1NjU0MzI5NjYsImlhdCI6MTU2NTQyOTM2Nn0.U vJiOQNO_yMzdenf5jAotPHj7zrcEUApraezzcVSicA

里面是这样的:

{“类型1”:“值1”,“类型2”:“值2”,“nbf”:1565429366,“exp”:1565432966,“iat”:1565429366}

请帮助摆脱 nbf、exp、iat。提前致谢!

cas*_*rad 4

创建令牌的代码的简化版本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;
}
Run Code Online (Sandbox Code Playgroud)

所以你基本上必须设置SetDefaultTimesOnTokenCreation为 false。JWT的标准没有反对空exp声明:

“exp”(过期时间)声明标识了过期时间,在此时间或之后 JWT 不得接受处理。

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

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

  • +1用于查看源代码。一般来说,如果您想知道某件事是如何工作的而不是猜测它,这是一个很好的做法。 (3认同)