.NET 8 Web API使用ASP.NET Core Identity返回404而非401问题
你遇到的现象核心原因是认证方案的默认配置被覆盖,且未正确关联到授权策略,具体拆解如下:
AddIdentity 覆盖了默认认证方案
你的配置顺序是先调用AddAuthentication(IdentityConstants.BearerScheme)设置默认认证方案为Bearer,但后续调用AddIdentity<MyUser, MyRole>()时,该方法内部会将默认认证方案重新设置为IdentityConstants.ApplicationScheme(这是Identity默认的Cookie认证方案)。这就导致默认的[Authorize]特性会使用Cookie认证方案,而非你配置的Bearer Token方案。404 而非 401/403 的原因
当默认使用Cookie认证方案时,API请求中没有携带Cookie,认证失败后,Cookie认证的默认逻辑会尝试跳转到登录页面(比如/Account/Login),但你的API并没有这个路由,所以返回了404错误,而非预期的401/403。显式指定认证方案恢复正常的原因
当你在[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

