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

ASP.Net Core 3.1网站未授权访问时未重定向到登录页问题

问题原因说明

1. 未授权JSON响应的来源

你看到的{"message":"Unauthorized"}响应来自Startup.cs中注册的app.UseStatusCodePages()中间件,这是ASP.NET Core内置的状态码处理中间件的默认返回格式,当它捕获到未处理的401状态码时,就会根据请求的Accept头返回对应格式的错误信息。

2. 未触发登录重定向的核心原因

有两个常见的诱因:

  • 缺少MVC服务注册:你给出的ConfigureServices代码中没有注册MVC控制器所需的服务,需要补充services.AddControllersWithViews()才能让MVC架构下的认证重定向约定正常生效。
  • Cookie认证的默认AJAX判断逻辑被拦截:Identity自带的Cookie认证默认会判断请求类型,如果被判定为AJAX/API请求,就会返回401状态码而非触发重定向,而UseStatusCodePages会优先捕获这个401状态码,直接返回JSON响应,覆盖了原本的重定向逻辑。

解决方案

按优先级依次尝试以下修改:

  1. 补充MVC服务注册
    在ConfigureServices方法中添加MVC控制器的服务注册:
services.AddControllersWithViews();
// 保留原有AddDefaultIdentity、ConfigureApplicationCookie等代码
  1. 替换默认状态码处理逻辑
    要么直接删除app.UseStatusCodePages();这行代码,要么将它改为带重定向/重执行的状态码处理逻辑,避免拦截认证重定向:
// 替换原有app.UseStatusCodePages()
app.UseStatusCodePagesWithReExecute("/Home/Error/{0}");
  1. 强制Cookie认证始终触发重定向
    如果想要无论什么请求类型都触发登录重定向,可以显式配置Cookie认证的重定向事件,覆盖默认的AJAX判断:
services.ConfigureApplicationCookie(options =>
{
    options.LoginPath = "/Identity/Account/Login";
    options.LogoutPath = "/Identity/Account/Logout";
    // 新增以下配置,强制所有未授权请求都跳转到登录页
    options.Events.OnRedirectToLogin = context =>
    {
        context.Response.Redirect(context.RedirectUri);
        return Task.CompletedTask;
    };
});

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.10 17:06:01