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 验证失败异常的主要内容,如果未能解决你的问题,请参考以下文章