默认挑战方案与RouteGroups配合异常:未授权请求返回404而非401
解决方案
1. 确保中间件顺序正确
在Startup.cs的Configure方法中,必须保证认证、授权与路由中间件的顺序符合ASP.NET Core的执行逻辑,这是引发该问题的最常见原因:
public void Configure(IApplicationBuilder app, IWebHostEnvironment env) { // 异常处理、静态文件等中间件放在最前 if (env.IsDevelopment()) { app.UseDeveloperExceptionPage(); } app.UseHttpsRedirection(); // 路由中间件需在认证中间件之前 app.UseRouting(); // 先执行身份验证 app.UseAuthentication(); // 再执行权限校验 app.UseAuthorization(); app.UseEndpoints(endpoints => { // 注册你的路由组 endpoints.MapGroup<EmployeeRouteGroup>(); }); }
2. 配置默认授权策略关联JWT认证方案
若中间件顺序无误但问题依旧,说明全局默认授权策略未绑定指定的JWT认证方案。在ConfigureServices中添加如下配置:
services.AddAuthorization(options => { options.DefaultPolicy = new AuthorizationPolicyBuilder() // 关联JWT认证方案 .AddAuthenticationSchemes(JwtBearerDefaults.AuthenticationScheme) // 要求请求必须来自已认证用户 .RequireAuthenticatedUser() .Build(); });
配置完成后,路由组中调用的RequireAuthorization()会自动使用该默认策略,无需在每个端点添加[Authorize]特性。
3. 显式为路由组指定认证方案(备选方案)
如果不想修改全局默认策略,可直接在路由组的ConfigureCommonBehaviour方法中指定认证方案:
protected override RouteGroupBuilder ConfigureCommonBehaviour(RouteGroupBuilder routeGroupBuilder) { return routeGroupBuilder.RequireAuthorization(options => { options.AddAuthenticationSchemes(JwtBearerDefaults.AuthenticationScheme); }); }
问题原因
调用无参数的RequireAuthorization()时,会使用框架默认的授权策略。若该策略未关联你的JWT认证方案,授权失败后的挑战流程无法正确触发JWT中间件返回401响应,反而因框架内部逻辑判定请求未匹配到有效端点,最终返回404。而显式添加[Authorize(AuthenticationScheme = ...)]特性时,直接指定了认证方案,绕过了默认策略的缺陷,因此能正常返回401。
内容的提问来源于stack exchange,提问作者Atlass-
相关产品推荐
相关产品推荐

