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
相关产品推荐
相关产品推荐

