.NET 6 Web API未授权访问返回404而非401状态码问题
问题根因
未认证请求返回404而非预期401的核心原因是ASP.NET Core Identity默认使用Cookie认证方案,该方案默认适配传统服务端渲染Web场景:未认证时会自动返回302重定向到默认登录路径(通常为/Account/Login)。由于你的项目是Web API,不存在对应登录页的路由,重定向后的请求匹配不到任何端点,最终返回404状态码,覆盖了原本应该返回的401响应。
修复步骤
你只需要在Program.cs的服务配置阶段,修改Cookie认证的默认事件逻辑,关闭针对API请求的自动重定向,直接返回对应状态码即可。
- 找到项目中注册Identity服务的代码段(通常以
builder.Services.AddIdentity<ApplicationUser, IdentityRole>()开头) - 在服务配置部分追加Cookie认证选项配置,代码如下:
// 注册Identity服务(保留你原有的配置即可) builder.Services.AddIdentity<ApplicationUser, IdentityRole>(options => { // 原有密码规则、用户配置等不需要改动 }) .AddEntityFrameworkStores<你的项目DbContext类型>() .AddSignInManager() .AddDefaultTokenProviders(); // 新增以下配置,修改Cookie认证的默认响应逻辑 builder.Services.ConfigureApplicationCookie(options => { // 未认证时直接返回401,不做登录页跳转 options.Events.OnRedirectToLogin = context => { context.Response.StatusCode = StatusCodes.Status401Unauthorized; return Task.CompletedTask; }; // 已认证但权限不足时直接返回403,不做访问拒绝页跳转 options.Events.OnRedirectToAccessDenied = context => { context.Response.StatusCode = StatusCodes.Status403Forbidden; return Task.CompletedTask; }; });
额外注意
你现有代码里AuthenticationController的构造函数存在参数名不匹配的编译错误:构造函数第三个参数定义为IdbContext _dbContext,但赋值时使用的是_dbContext = dbContext;,把参数名改为IdbContext dbContext即可修复,该问题和当前404异常无关。
你原有的中间件顺序(UseAuthentication在UseAuthorization之前)、全局授权过滤器配置都是正确的,不需要调整。配置完成后重启应用,未认证状态下调用受保护接口就会正常返回401状态码。
内容的提问来源于stack exchange,提问作者Steve
相关产品推荐
相关产品推荐

