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

ASP.NET配置JWT后使用[Authorize]返回404问题排查

问题根因
  • 不带认证方案的[Authorize]特性触发时,未使用你配置的JWT Bearer认证逻辑,反而触发了Cookie认证的跳转逻辑,会重定向到不存在的登录页路由,最终返回404。
  • 你仅配置了认证服务的默认方案,未显式绑定授权服务的默认策略,导致授权中间件没有正确关联JWT Bearer认证方案;如果项目中引入了ASP.NET Core Identity,Identity的默认配置会覆盖你设置的默认认证/挑战方案,也会触发该问题。
  • 指定AuthenticationSchemes = "Bearer"时,会强制使用JWT Bearer的挑战逻辑,认证失败直接返回401,不会触发跳转,因此可以正常运行。
修复方案

1. 显式配置授权默认策略

在ConfigureServices方法中添加以下授权配置,将默认策略绑定到JWT Bearer方案:

services.AddAuthorization(options =>
{
    options.DefaultPolicy = new AuthorizationPolicyBuilder(JwtBearerDefaults.AuthenticationScheme)
        .RequireAuthenticatedUser()
        .Build();
});

配置完成后,直接使用[Authorize]特性就会自动使用JWT Bearer认证,无需每次指定方案。

2. 核对中间件顺序

确认Configure方法中中间件顺序正确,认证中间件必须在授权中间件之前:

app.UseAuthentication();
app.UseAuthorization();

3. 若使用ASP.NET Core Identity的额外配置

如果项目引入了Identity,需要做两处额外调整:

调整配置顺序

必须先配置Identity,再配置JWT认证,避免Identity覆盖默认方案:

// 先配置Identity
services.AddIdentity<IdentityUser, IdentityRole>(options =>
{
    // 你的Identity相关配置
})
.AddEntityFrameworkStores<你的DbContext类>();

// 再配置JWT认证
services.AddAuthentication(options =>
{
    options.DefaultAuthenticateScheme = JwtBearerDefaults.AuthenticationScheme;
    options.DefaultChallengeScheme = JwtBearerDefaults.AuthenticationScheme;
}).AddJwtBearer(options =>
{
    // 你原有的JWT配置
});

关闭Identity默认Cookie跳转

禁用Identity默认的登录跳转逻辑,认证失败直接返回状态码:

services.ConfigureApplicationCookie(options =>
{
    options.Events.OnRedirectToLogin = context =>
    {
        context.Response.StatusCode = StatusCodes.Status401Unauthorized;
        return Task.CompletedTask;
    };
    options.Events.OnRedirectToAccessDenied = context =>
    {
        context.Response.StatusCode = StatusCodes.Status403Forbidden;
        return Task.CompletedTask;
    };
});

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.06 19:57:00