.NET 6 MVC中Asp.net Identity登录成功后仍重定向至登录页
核心问题分析
导致登录成功后重定向回登录页的原因主要有以下几点:
1. 账号未满足"已确认"要求
你在AddDefaultIdentity中设置了options.SignIn.RequireConfirmedAccount = true,这意味着只有邮箱已确认的账号才能访问受保护资源(你的HomeController加了[Authorize]特性)。如果你的账号未确认(数据库AspNetUsers表中EmailConfirmed字段为false),即使登录验证通过,Identity也会拦截请求并重定向回登录页。
2. 认证服务重复配置冲突
AddDefaultIdentity已经自动注册了Identity的Cookie认证方案(IdentityConstants.ApplicationScheme),你额外添加的AddAuthentication(...).AddCookie(...)属于重复配置,会干扰Identity的默认认证流程,导致Cookie验证异常,引发重定向循环。
3. 路由规则导致的returnUrl跳转异常
你通过options.Conventions.AddAreaPageRoute("Identity", "/Account/Login", "")将空路径(~/)映射到登录页,而登录成功后默认的returnUrl是~/。此时路由系统会优先匹配Razor Pages的路由规则,再次跳转到登录页,而非预期的Home/Index。
分步解决方案
解决账号确认问题
- 临时测试方案:关闭账号确认要求,修改
AddDefaultIdentity的配置:builder.Services.AddDefaultIdentity<IdentityUser>(options => options.SignIn.RequireConfirmedAccount = false) .AddEntityFrameworkStores<ApplicationDbContext>(); - 正式环境方案:确保用户账号已确认,可在注册逻辑中添加自动确认代码:
或手动在数据库中将// 注册时自动确认邮箱和账号 var user = new IdentityUser { UserName = Input.Email, Email = Input.Email }; var result = await _userManager.CreateAsync(user, Input.Password); if (result.Succeeded) { await _userManager.SetEmailConfirmedAsync(user, true); // 其他注册逻辑... }AspNetUsers表对应账号的EmailConfirmed字段设为true。
移除重复的认证配置
删除Program.cs中这段冗余代码:
builder.Services.AddAuthentication(IdentityConstants.ApplicationScheme).AddCookie(options => { options.LoginPath = "/Identity/Account/Login"; });
修正登录后的跳转目标
修改Login.cshtml.cs中OnGetAsync和OnPostAsync方法的returnUrl默认值,明确指向Home/Index:
// OnGetAsync中 returnUrl ??= Url.Action("Index", "Home"); // OnPostAsync中 returnUrl ??= Url.Action("Index", "Home");
验证步骤
- 重启应用,使用已确认的账号(或关闭确认要求)登录。
- 检查登录成功后是否正确跳转到
Home/Index页面。
内容的提问来源于stack exchange,提问作者Shaksham Singh

