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

默认挑战方案与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-

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.15 15:42:39