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

.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请求的自动重定向,直接返回对应状态码即可。

  1. 找到项目中注册Identity服务的代码段(通常以builder.Services.AddIdentity<ApplicationUser, IdentityRole>()开头)
  2. 在服务配置部分追加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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.30 21:54:29