ASP.NET Core 7登录状态跳转异常:重启调试器后页面显示错误
ASP.NET Core 7 登录状态持久化与自动跳转问题解决
你遇到的核心问题是中间件顺序错误导致认证状态无法被正确识别,加上登录时未启用持久Cookie,重启浏览器后身份丢失,同时存在路由跳转的写法错误。以下是针对性解决方案:
1. 修正Program.cs中的中间件顺序
ASP.NET Core中间件执行顺序直接影响认证逻辑生效,你的代码里顺序完全错位,正确顺序如下:
app.UseHttpsRedirection(); app.UseRequestLocalization(locOptions); // 本地化需放在静态文件前 app.UseStaticFiles(); app.UseRouting(); // 路由必须在认证、授权中间件之前 app.UseAuthentication(); app.UseAuthorization(); // 先映射控制器路由,再处理Razor Pages app.MapControllerRoute( name: "default", pattern: "{controller=Home}/{action=Index}/{id?}"); app.MapRazorPages(); app.Run();
2. 启用持久化登录Cookie
默认登录Cookie是会话级的,关闭浏览器就失效。要保留登录状态,需在登录逻辑中设置持久化属性:
找到你的登录处理代码(比如Login.cshtml.cs的OnPostAsync方法),修改认证逻辑:
// 示例:使用SignInManager的场景 var result = await _signInManager.PasswordSignInAsync( Input.Email, Input.Password, Input.RememberMe, // 绑定页面的"记住我"复选框 lockoutOnFailure: false ); // 如果是手动构建认证票据的场景 var authProperties = new AuthenticationProperties { IsPersistent = true, // 开启持久化 ExpiresUtc = DateTimeOffset.UtcNow.AddDays(7) // 可选:设置Cookie过期时间 }; await HttpContext.SignInAsync(CookieAuthenticationDefaults.AuthenticationScheme, userPrincipal, authProperties);
3. 修正HomeController的跳转逻辑
RedirectToAction接收的是动作名称,不是视图文件路径,同时给主页添加授权校验:
using Microsoft.AspNetCore.Authorization; using Microsoft.AspNetCore.Mvc; namespace WebApplication3.Controllers { public class HomeController : Controller { public IActionResult Index() { if (User.Identity.IsAuthenticated) { // 跳转到HomePage动作 return RedirectToAction(nameof(HomePage)); } // 未登录时跳转到Razor Page版的登录页 return RedirectToPage("/Index"); } [Authorize] // 强制只有登录用户能访问主页 public IActionResult HomePage() { return View(); } } }
4. 解决Razor Page与Controller的路由冲突
你的Index.cshtml是带有@page指令的Razor Page,和Home/Index控制器动作存在路由匹配冲突,二选一调整:
- 方案一:把
Index.cshtml改成Controller视图,移除@page和@model IndexModel,放到Views/Home/Index.cshtml目录下。 - 方案二:调整默认路由,让根路径指向Razor Page,同时在
Index.cshtml的后台代码中添加跳转逻辑:
并修改Program.cs中的路由配置:// Index.cshtml.cs中的OnGet方法 public IActionResult OnGet() { if (User.Identity.IsAuthenticated) { return RedirectToAction("HomePage", "Home"); } return Page(); }app.MapRazorPages(); app.MapControllerRoute( name: "default", pattern: "{controller=Home}/{action=HomePage}/{id?}");
内容的提问来源于stack exchange,提问作者Maksio
相关产品推荐
相关产品推荐

