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

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了为什么即使我将Expires设置为null,JWT仍包含EXP声明?相关的知识,希望对你有一定的参考价值。

我需要不朽的JWT token。当然,我可以为Expires设置一些大的值,但我更喜欢在我的token中完全不包含exp claim。标准的.net core CreateEncodedJwt允许在expires、notBefore和 issuedAt中传递null。我在所有这些选项中都传递了null,而我的token中包含了exp token(+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.

这是我的token。

eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ0eXBlMSI6InZhbHVlMSIsInR5cGUyIjoidmFsdWUyIiwibmJmIjoxNTY1NDI5MzY2LCJleHAiOjE1NjU0MzI5NjYsImlhdCI6MTU2NTQyOTM2Nn0.UvJiOQNO_yMzdenf5jAotPHj7zrcEUApraezzcVSicA

这是里面的样子。

{ "type1": "value1", "type2": "value2", "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 到假。而标准为 JWT 空口无凭 exp 索赔。

"exp" (过期时间)的要求,标识JWT不得接受处理的过期时间。

其值必须是一个包含NumericDate值的数字。 使用这个要求是可选的。

因此,所有正确的JWT格式验证器的实现都应该成功地验证没有该声明的token。

以上是关于为什么即使我将Expires设置为null,JWT仍包含EXP声明?的主要内容,如果未能解决你的问题,请参考以下文章

为啥即使在我将约束设置为 0 后 UITableView 上仍有余量

即使我将应用程序清单设置为纵向,为啥我的 Android 相机预览仍显示横向?

如何保护JWT令牌

即使 AllowDBNull = False,数据集也允许 Null 值?

为啥当我在 uiscrollview 顶部添加对象时,即使我将所有四个约束都设置为 0,对象也会下降一点?

Express 更新 JWT 以响应