You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在ASP.NET Core 8.0指定端点允许过期JWT且不影响其他路由?

解决方案:双JWT认证方案分离验证规则

针对你遇到的共享TokenValidationParameters导致的间歇性问题,最简洁可靠的方案是配置两个独立的JWT Bearer认证方案,分别对应正常验证和允许过期令牌的场景,完全满足你的需求:

步骤1:配置双认证方案

在Program.cs中添加两个JWT认证配置,一个作为默认方案强制验证令牌生命周期,另一个专门用于刷新令牌端点跳过生命周期验证:

builder.Services.AddAuthentication()
    // 默认认证方案:验证令牌有效期,适用于绝大多数端点
    .AddJwtBearer(JwtBearerDefaults.AuthenticationScheme, options =>
    {
        options.TokenValidationParameters = new TokenValidationParameters
        {
            ValidateIssuer = true,
            ValidateAudience = true,
            ValidateLifetime = true, // 强制验证令牌生命周期
            ValidateIssuerSigningKey = true,
            // 替换为你的JWT配置
            ValidIssuer = builder.Configuration["Jwt:Issuer"],
            ValidAudience = builder.Configuration["Jwt:Audience"],
            IssuerSigningKey = new SymmetricSecurityKey(Encoding.UTF8.GetBytes(builder.Configuration["Jwt:Key"]))
        };
    })
    // 刷新令牌专用方案:跳过生命周期验证
    .AddJwtBearer("AllowExpiredTokens", options =>
    {
        options.TokenValidationParameters = new TokenValidationParameters
        {
            ValidateIssuer = true,
            ValidateAudience = true,
            ValidateLifetime = false, // 允许过期令牌
            ValidateIssuerSigningKey = true,
            // 与默认方案保持一致的Issuer、Audience和密钥配置
            ValidIssuer = builder.Configuration["Jwt:Issuer"],
            ValidAudience = builder.Configuration["Jwt:Audience"],
            IssuerSigningKey = new SymmetricSecurityKey(Encoding.UTF8.GetBytes(builder.Configuration["Jwt:Key"]))
        };
    });

// 设置默认授权策略使用默认认证方案
builder.Services.AddAuthorization(options =>
{
    options.DefaultPolicy = new AuthorizationPolicyBuilder()
        .AddAuthenticationSchemes(JwtBearerDefaults.AuthenticationScheme)
        .RequireAuthenticatedUser()
        .Build();
});

步骤2:修改刷新令牌端点的授权属性

在刷新令牌端点的[Authorize]属性中指定使用专用的认证方案:

[HttpPost("login-refresh-token")]
[Authorize(AuthenticationSchemes = "AllowExpiredTokens")]
public async Task<ActionResult<AccessTokenDto>> RefreshTokenLogin([FromBody] RefreshTokenRequestModel requestModel)
{
    // 这里可以直接通过User获取令牌的Claims(框架已完成除生命周期外的所有验证)
    // 结合请求体中的刷新令牌完成新访问令牌的签发逻辑
    ...
}

方案优势

  • 无需手动解析JWT:所有令牌解析和验证由框架自动完成
  • 无需创建新验证主体:认证流程完全复用框架自带的逻辑,主体由中间件生成
  • 路由隔离严格:只有标注了AllowExpiredTokens方案的端点允许过期令牌,其余端点强制验证生命周期,彻底解决共享参数导致的间歇性问题

内容的提问来源于stack exchange,提问作者adnan kamili

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.15 18:34:52