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; }; });
额外检查点
- 登录逻辑正确性:确保登录端点中正确执行了用户认证会话的创建,示例代码如下:
[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(); }
- Web API返回类型:你的
Get方法返回View(),这是MVC视图的返回方式,Web API项目建议返回Ok()、Unauthorized()等ObjectResult类型,避免不必要的视图查找逻辑。
内容的提问来源于stack exchange,提问作者jDally987
相关产品推荐
相关产品推荐

