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

.NET 8 Web API使用ASP.NET Core Identity返回404而非401问题

问题原因分析

你遇到的现象核心原因是认证方案的默认配置被覆盖,且未正确关联到授权策略,具体拆解如下:

  1. AddIdentity 覆盖了默认认证方案
    你的配置顺序是先调用AddAuthentication(IdentityConstants.BearerScheme)设置默认认证方案为Bearer,但后续调用AddIdentity<MyUser, MyRole>()时,该方法内部会将默认认证方案重新设置为IdentityConstants.ApplicationScheme(这是Identity默认的Cookie认证方案)。这就导致默认的[Authorize]特性会使用Cookie认证方案,而非你配置的Bearer Token方案。

  2. 404 而非 401/403 的原因
    当默认使用Cookie认证方案时,API请求中没有携带Cookie,认证失败后,Cookie认证的默认逻辑会尝试跳转到登录页面(比如/Account/Login),但你的API并没有这个路由,所以返回了404错误,而非预期的401/403。

  3. 显式指定认证方案恢复正常的原因
    当你在[Authorize]中显式指定AuthenticationSchemes = "Identity.Bearer"(即IdentityConstants.BearerScheme的字符串值),授权系统会直接使用你配置的Bearer Token认证方案,跳过了被覆盖的默认方案,因此可以正常验证Token并返回正确的授权结果。

解决方案

要彻底解决这个问题,你有两种可选方式:

  • 调整配置顺序,让AddIdentity先执行,再设置默认认证方案
    把AddIdentity的调用放在AddAuthentication之前,这样后续设置的Bearer方案就能覆盖Identity默认的Cookie方案:

    services
        .AddIdentity<MyUser, MyRole>()
        .AddEntityFrameworkStores<AppDbContext>()
        .AddApiEndpoints()
        .AddDefaultTokenProviders();
    
    services
        .AddAuthentication(IdentityConstants.BearerScheme)
        .AddBearerToken(IdentityConstants.BearerScheme, options =>
        {
            options.ClaimIssuer = "test";
        });
    services.AddAuthorization();
    
  • 修改默认授权策略,关联Bearer认证方案
    保持现有配置顺序,通过AddAuthorization配置默认策略,强制使用Bearer方案:

    services.AddAuthorization(options =>
    {
        options.DefaultPolicy = new AuthorizationPolicyBuilder()
            .AddAuthenticationSchemes(IdentityConstants.BearerScheme)
            .RequireAuthenticatedUser()
            .Build();
    });
    

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.01 09:23:15