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响应,覆盖了原本的重定向逻辑。
解决方案
按优先级依次尝试以下修改:
- 补充MVC服务注册
在ConfigureServices方法中添加MVC控制器的服务注册:
services.AddControllersWithViews(); // 保留原有AddDefaultIdentity、ConfigureApplicationCookie等代码
- 替换默认状态码处理逻辑
要么直接删除app.UseStatusCodePages();这行代码,要么将它改为带重定向/重执行的状态码处理逻辑,避免拦截认证重定向:
// 替换原有app.UseStatusCodePages() app.UseStatusCodePagesWithReExecute("/Home/Error/{0}");
- 强制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
相关产品推荐
相关产品推荐

