【发布时间】:2018-05-22 13:25:21
【问题描述】:
我需要检查我的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;
}
谁能解释发生了什么或者我做错了什么?
编辑(用于解释目的)
测试 1
- 我的设备当前时间:10:06
- 使用
expiration = DateTime.Now.AddSeconds(5); - 令牌的生命周期 = 12:06:10 和种类 = UTC
- 验证正常。
测试 2
- 我的设备当前时间:10:16
- 使用
expiration = DateTime.SpecifyKind(DateTime.Now, DateTimeKind.Utc).AddSeconds(5); - 令牌的生命周期 = 10:16:12 和种类 = UTC
- 验证失败:
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'.
测试 3
- 使用
expiration = DateTime.UtcNow.AddSeconds(5); - 令牌的生命周期 = 13:07:10 和种类 = UTC
- 验证正常。
但是为什么如果我运行验证时是 13:12 并且令牌的生命周期是 13:07,验证会通过?到期时是否有最低投注时间?
【问题讨论】:
-
你能解释一下这是哪个库吗?
-
@ParvSharma 问题已编辑。
-
请看我的回答
-
"检查它的生命周期,我比当前时间晚了 2 小时。"你如何准确地检查它的寿命? (无论如何,我建议您使用
DateTime.UtcNow,请注意...) -
@JonSkeet 问题已编辑!