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

ASP.NET Core Web API认证时返回405而非401问题排查

问题原因

当未认证请求访问带[Authorize]的API接口时,Cookie认证中间件默认会返回302重定向到配置的LoginPath(即/Account/Login)。但由于控制器标记了[ApiController],ASP.NET Core的API行为机制会对这个重定向响应进行特殊处理:

  • 如果客户端请求是API类型(通常Accept头为application/json),框架不会直接返回302,而是尝试检查重定向目标路径/Account/Login是否支持原请求的HTTP方法(这里是GET)。
  • 若/Account/Login对应的Action仅支持POST方法(比如登录提交接口),或者该路由根本不存在,就会返回405 Method Not Allowed错误,而非预期的401。
解决方案

修改Cookie认证的配置,让它针对API请求直接返回401 Unauthorized,而非重定向。在AddCookie的选项中自定义OnRedirectToLogin事件:

services.AddAuthentication(CookieAuthenticationDefaults.AuthenticationScheme)
    .AddCookie(options =>
    {
        options.Cookie.Name = "Cookie";
        options.LoginPath = "/Account/Login";
        
        // 自定义重定向逻辑,针对API请求返回401
        options.Events.OnRedirectToLogin = context =>
        {
            // 判断是否为API请求(根据路径特征或Accept头)
            if (context.Request.Path.StartsWithSegments("/WeatherForecast") || 
                context.Request.Headers["Accept"].Contains("application/json"))
            {
                context.Response.StatusCode = StatusCodes.Status401Unauthorized;
                return Task.CompletedTask;
            }
            // 非API请求仍执行默认重定向(比如MVC页面)
            context.Response.Redirect(context.RedirectUri);
            return Task.CompletedTask;
        };
    });
额外说明
  • [ApiController]特性会自动启用客户端错误映射和路由严格匹配,这会改变默认的错误响应行为,所以需要针对API场景调整认证中间件的响应逻辑。
  • 若项目是纯API服务,建议直接禁用Cookie认证的重定向行为,统一返回401;若同时包含MVC页面和API,可以通过请求路径、Header等特征区分处理。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.14 14:15:19