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

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的后台代码中添加跳转逻辑:
    // Index.cshtml.cs中的OnGet方法
    public IActionResult OnGet()
    {
        if (User.Identity.IsAuthenticated)
        {
            return RedirectToAction("HomePage", "Home");
        }
        return Page();
    }
    
    并修改Program.cs中的路由配置:
    app.MapRazorPages();
    app.MapControllerRoute(
        name: "default",
        pattern: "{controller=Home}/{action=HomePage}/{id?}");
    

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.12 05:25:21