JwtSecurityTokenHandler.ValidateToken 抛出 Lifetime 验证失败异常
Posted
技术标签:
【中文标题】JwtSecurityTokenHandler.ValidateToken 抛出 Lifetime 验证失败异常【英文标题】:JwtSecurityTokenHandler.ValidateToken throwing Lifetime validation failed exception 【发布时间】:2021-09-14 18:35:58 【问题描述】:我正在创建一个 ASP.net core 5 Web API。在尝试获取刷新令牌时,会对当前令牌进行各种验证检查。我的初始检查是使用 JwtSecurityTokenHandler.ValidateToken 和下面的代码。
var tokenInVerification = jwtTokenHandler.ValidateToken(tokenRequest.Token, _tokenValidationParams, out var validatedToken);
但是它抛出:
IDX10223: Lifetime validation failed. The token is expired. ValidTo: 'System.DateTime', Current time: 'System.DateTime'
有没有办法解决这个问题,因为我不希望它抛出异常但继续,以便我可以运行其他验证检查。
我正在迭代over
【问题讨论】:
如果我理解正确你想忽略生命周期验证。对吗? 【参考方案1】:只需将ValidateLifetime=false
设置为_tokenValidationParams
var _tokenValidationParams= new TokenValidationParameters
ValidateAudience = true,
ValidAudience = GetValidAudience(),
ValidIssuer = GetValidIssuer(),
IssuerSigningKey = GetIssuerSigningKey(),
ValidateIssuerSigningKey = true,
ValidateIssuer = true,
ValidateLifetime = false //Here we are saying that we don't care about the token's expiration date
;
【讨论】:
虽然这会抑制错误,但它不会告诉用户令牌在设置时间后无效。 @wooldon 据我了解,您想检查当前令牌并接收刷新令牌。我想不出您关心当前令牌的过期时间的任何原因,因为如果当前令牌有效,则没有理由请求刷新令牌。顺便说一句,如果您需要检查每个验证,为什么不在不同的 try catch 中使用不同的 validationParams 多次调用 ValidateToken 来检查不同的验证? 我通过在 VerifyAndGenerateToken 函数中使用一组不同的 TokenValidationParameters 解决了这个问题。我启动中的 TokenValidationParameters 有 ValidateLifetime = true 而 VerifyAndGenerateToken 函数中的设置为 false。这样我就可以自己测试到期日期,同时使用 JwtSecurityTokenHandler 进行验证。以上是关于JwtSecurityTokenHandler.ValidateToken 抛出 Lifetime 验证失败异常的主要内容,如果未能解决你的问题,请参考以下文章