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

ASP.NET Core 6 Web API基于Session登录时[Authorize]端点返回404

问题原因

Cookie认证默认的挑战逻辑是跳转到登录页面(默认路径/login),但你的Web API项目并没有这个登录页面端点,所以当未认证请求触发[Authorize]的挑战时,会因为找不到/login返回404错误,而非预期的401未授权。这和JWT认证的逻辑不同——JWT认证在未授权时直接返回401响应,不会跳转。

解决方案

修改Cookie认证的配置,禁用跳转行为,直接返回401状态码:

在Program.cs的AddCookie方法中添加事件配置:

builder.Services.AddAuthentication(options =>
{
    options.DefaultAuthenticateScheme = CookieAuthenticationDefaults.AuthenticationScheme;
    options.DefaultChallengeScheme = CookieAuthenticationDefaults.AuthenticationScheme;
    options.DefaultScheme = CookieAuthenticationDefaults.AuthenticationScheme;
}).AddCookie(options =>
{
    // 拦截跳转登录页的行为,直接返回401
    options.Events.OnRedirectToLogin = context =>
    {
        context.Response.StatusCode = StatusCodes.Status401Unauthorized;
        return Task.CompletedTask;
    };

    // 可选:如果需要处理其他跳转场景(如访问被禁止的资源),可以一并修改
    options.Events.OnRedirectToAccessDenied = context =>
    {
        context.Response.StatusCode = StatusCodes.Status403Forbidden;
        return Task.CompletedTask;
    };
});
额外检查点
  1. 登录逻辑正确性:确保登录端点中正确执行了用户认证会话的创建,示例代码如下:
[HttpPost("login")]
public async Task<IActionResult> Login(LoginModel model)
{
    // 验证用户逻辑...
    var user = await _userManager.FindByNameAsync(model.Username);
    if (user != null && await _userManager.CheckPasswordAsync(user, model.Password))
    {
        await HttpContext.SignInAsync(CookieAuthenticationDefaults.AuthenticationScheme, 
            new ClaimsPrincipal(new ClaimsIdentity(await _userManager.GetClaimsAsync(user), CookieAuthenticationDefaults.AuthenticationScheme)));
        return Ok();
    }
    return Unauthorized();
}
  1. Web API返回类型:你的Get方法返回View(),这是MVC视图的返回方式,Web API项目建议返回Ok()、Unauthorized()等ObjectResult类型,避免不必要的视图查找逻辑。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.20 05:13:14