首页 > 解决方案 > .NET 5 Web API 中的 JWT 授权和刷新令牌

问题描述

我在 .NET 5 Web API 项目和 Angular 11 的前端创建了 JWT 授权/身份验证服务,我遇到的一个问题是刷新令牌功能。当我发送刷新令牌请求时。我正在使用 Microsoft 提供的 JwtSecurityTokenHandler 类中的 Validate Token 函数,如果令牌已经过期,它会抛出异常 ,所以我的问题是,我应该在它过期之前发送刷新令牌请求吗?如果不是,我如何在验证令牌功能中禁用令牌过期检查,或者我应该编写我自己的该功能版本?

标签: authenticationjwt.net-5webapirefresh-token

解决方案


您可以轻松禁用令牌过期检查。只需新建TokenValidationParameters并设置ValidateLifetime为false。像这样的东西

public ClaimsPrincipal GetPrincipalFromExpiredToken(string jwtToken)
{
    var tokenValidationParameters = new TokenValidationParameters
    {
        ValidateAudience = true,
        ValidAudience = configuration["security:audience"],
        ValidIssuer = configuration["security:issuer"],
        ValidateIssuer = true,
        ValidateIssuerSigningKey = true,
        IssuerSigningKey = GetIssuerSigningKey(),
        ValidateLifetime = false //here we are saying that we don't care about the token's expiration date
    };

    var tokenHandler = new JwtSecurityTokenHandler();
    var principal = tokenHandler.ValidateToken(jwtToken, tokenValidationParameters, out SecurityToken securityToken);
    var jwtSecurityToken = securityToken as JwtSecurityToken;
    if (jwtSecurityToken == null || !jwtSecurityToken.Header.Alg.Equals(SecurityAlgorithms.HmacSha256, StringComparison.InvariantCultureIgnoreCase))
        throw new SecurityTokenException("Invalid token");

    return principal;
}

推荐阅读