我需要检查我的JwtSecurityToken
是否已过期。
我正在使用System.IdentityModel.Tokens.Jwt
库。
当像这样创建JwtSecurityToken
时:
var token = new JwtSecurityToken(
issuer: token_issuer,
audience: token_audience,
claims: claims,
expires: DateTime.Now.AddMinutes(15),
signingCredentials: creds
);
并检查它的生命周期,我当前时间后<2>小时。
我以这种方式检查生命周期(仅用于测试目的):
var lifeTime = new JwtSecurityTokenHandler().ReadToken(token).ValidTo;
我的验证方法:
private static bool ValidateToken(string token)
{
try
{
TokenValidationParameters validationParameters = new TokenValidationParameters
{
IssuerSigningKey = new SymmetricSecurityKey(token_salt),
ValidAudience = token_audience,
ValidIssuer = token_issuer,
RequireExpirationTime = true
};
var lifeTime = new JwtSecurityTokenHandler().ReadToken(token).ValidTo;
ClaimsPrincipal principal = new JwtSecurityTokenHandler().ValidateToken(token_last, validationParameters, out SecurityToken validatedToken);
return true;
}
catch(Exception ex)
{
}
return false;
}
任何人都可以解释发生了什么,或者我做错了什么?
编辑(出于解释目的)
expiration = DateTime.Now.AddSeconds(5);
expiration = DateTime.SpecifyKind(DateTime.Now, DateTimeKind.Utc).AddSeconds(5);
Microsoft.IdentityModel.Tokens.SecurityTokenExpiredException: IDX10223: Lifetime validation failed. The token is expired. ValidTo: '12/11/2017 10:16:12'
Current time: '12/11/2017 12:18:40'.
expiration = DateTime.UtcNow.AddSeconds(5);
但为什么验证通过,如果我运行验证时是13:12而令牌的生命周期是13:07?是否有最短的投注时间到期?
答案 0 :(得分:2)
From the only source of this library got from google search您可以看到时间正在转换为通用时间(UTC)。
DateTime.Now.AddMinutes(15)
似乎是个问题
用Datetime.UtcNow.AddMinutes(15)
替换它可能会解决它
您当地的时区是UTC + 2:00吗?
答案 1 :(得分:2)
我知道,这是一个老问题,但是TokenValidationParameters
类具有名为ClockSkew
的属性,默认情况下设置为5分钟。这可能是您的问题,因为这是我的。只需将此属性设置为例如1秒-ClockSkew = TimeSpan.FromSeconds(1)
。