为什么即使我将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 相机预览仍显示横向?
即使 AllowDBNull = False,数据集也允许 Null 值?