即使将Expires设置为null,为什么JWT仍包含EXP索赔?

时间:2019-08-10 09:37:14

标签: asp.net-core jwt

我需要永生的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。预先感谢!

1 个答案:

答案 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格式验证程序实现都应成功验证令牌,而无需在内部声明该声明。