忽略某些路由上的过期令牌

Posted

技术标签:

【中文标题】忽略某些路由上的过期令牌【英文标题】:Ignore expired tokens on certain routes 【发布时间】:2020-06-21 07:29:26 【问题描述】:

使用 JWT 令牌,我正在为我的 .NET Core API 进行身份验证。我想知道当用户请求某个路由(例如“/refresh”)以刷新过期令牌时,我是否可以告诉我的 API 忽略令牌的到期。我知道可以通过 POST 请求提供令牌来解决它,但我希望能够在我只想识别调用用户时忽略令牌的到期。

我的代码如下所示。目前它适用于 POST 请求,但我希望能够通过标头提供过期令牌。

[AllowAnonymous]
[HttpPost("refresh")]
public async Task<IActionResult> Refresh(RefreshRequest refreshRequest)

    // Validate refresh token
    if (!_tokenService.RefreshTokenValid(refreshRequest.Refresh_Token)) 
        return BadRequest("The request token is not a valid token.");
    

    var tokenHandler = new JwtSecurityTokenHandler();

    // Validate actual token
    if (!tokenHandler.CanReadToken(refreshRequest.Token)) 
        return BadRequest("The JWT token is not a valid token.");
    

    // Get the user from the JWT token
    var userId = _tokenService.GetUserIdFromtoken(refreshRequest.Token);
    var repoUser = await _repo.GetUserById(userId);

    // Map the user, generate a token and send response
    var newToken = _tokenService.GenerateRefreshedJwtToken(repoUser);
    var tokenUser = _mapper.Map(repoUser, new AuthRefreshedTokenUser(newToken));
    return Ok(tokenUser);

【问题讨论】:

AllowAnonymous 将跳过身份验证中间件,无论您是否提供正确的令牌,当前代码有什么问题? AllowAnonymous 完全忽略令牌。这意味着不会识别 ClaimsPrincipal 用户,并且必须手动完成所有操作。这是一个可能的解决方案,但不是比我现在拥有的更好的手动获取令牌的解决方案。 您可以创建另一个身份验证架构并设置为不验证令牌的生命周期,请参阅下面的回复 【参考方案1】:

一种简单的方法是创建另一个身份验证架构并设置为不验证令牌的生命周期:

.AddJwtBearer(options =>

    ...
    options.TokenValidationParameters.ValidateLifetime = false;
    ....

);

并使用[Authorize(AuthenticationSchemes = "schemeName")] 在特定控制器/操作上应用该身份验证方案。

【讨论】:

以上是关于忽略某些路由上的过期令牌的主要内容,如果未能解决你的问题,请参考以下文章

Spring Boot 安全性 - 允许使用过期 JWT 令牌的用户请求

如何处理 Cognito 上的令牌过期问题

仅在刷新页面时令牌过期时注销?为啥?

Laravel 护照授权令牌在生成新令牌时过期

如何手动使 JWT 令牌过期?

Twitter API - “无效或过期令牌”的原因