ASP.NET Core 6 MVC 会话/闲置超时后无法重定向至自定义登录页的问题
我看了你贴的代码,首先发现一个很明显的问题:你重复调用了builder.Services.ConfigureApplicationCookie方法,而且第二次的代码还没写完(options.Acces...),这种重复配置很容易导致覆盖或者冲突,先把这个问题解决掉——只保留一次完整的ConfigureApplicationCookie配置。
接下来咱们一步步排查其他可能导致重定向失效的原因:
确保配置顺序正确:如果你的项目使用了Identity相关服务(比如
AddDefaultIdentity或AddIdentity),一定要在添加Identity服务之后再调用ConfigureApplicationCookie,不然Identity的默认配置会覆盖你自定义的登录路径。正确的顺序示例如下:// 先添加Identity服务 builder.Services.AddDefaultIdentity<IdentityUser>(options => options.SignIn.RequireConfirmedAccount = true) .AddEntityFrameworkStores<ApplicationDbContext>(); // 再配置认证Cookie,这一步必须放在AddIdentity之后 builder.Services.ConfigureApplicationCookie(options => { options.Cookie.HttpOnly = true; options.ExpireTimeSpan = TimeSpan.FromMinutes(builder.Configuration.GetValue<int>("MIGSettings:SessionTiming")); options.LoginPath = "/login"; options.AccessDeniedPath = "/login"; options.SlidingExpiration = true; });验证自定义登录页的路由是否存在:确认你的项目里有对应的
LoginController,并且有返回自定义登录视图的Index方法,保证路由能正确映射到/login:public class LoginController : Controller { public IActionResult Index() { return View(); } }同时要确保
Views/Login/Index.cshtml视图文件存在,不然会出现404错误,系统可能会自动跳转到默认的Identity登录页兜底。检查中间件顺序是否正确:在
Program.cs配置中间件时,要保证app.UseAuthentication()和app.UseAuthorization()的顺序,并且放在路由中间件之后、端点中间件之前:app.UseHttpsRedirection(); app.UseStaticFiles(); app.UseRouting(); // 这两个中间件顺序不能乱,且位置要正确 app.UseAuthentication(); app.UseAuthorization(); app.MapControllerRoute( name: "default", pattern: "{controller=Home}/{action=Index}/{id?}"); app.MapRazorPages(); // 如果项目用到了Razor Pages形式的Identity,这个中间件不能少清理浏览器缓存和Cookie:有时候旧的认证Cookie会残留,导致测试结果不准确,建议清空浏览器缓存和Cookie,或者用隐私窗口测试新配置。
最后再确认appsettings.json里的MIGSettings:SessionTiming是有效的整数值,比如:
{ "MIGSettings": { "SessionTiming": 30 } }
备注:内容来源于stack exchange,提问作者user24192006

