在导航菜单中嵌入ASP.NET Identity LoginPartial后用户无法正常登录
Hey,咱们来捋捋你遇到的这个问题:明明登录成功了,却被弹回登录页,给Account/Index加了AllowAnonymous后能打开但又拿不到用户数据,这事儿确实有点头疼。我帮你拆解下原因,再给你一步步的解决办法。
核心问题在哪?
从你描述的现象来看,关键问题其实是登录成功后,系统没正确识别到你已经登录了。所以当你要跳转到Account/Index时,因为这个页面需要授权(要么是全局加了Authorize过滤器,要么是你没给它加AllowAnonymous),系统就把你重定向回登录页了。而加了AllowAnonymous后能打开,但此时你是匿名状态,自然拿不到User.Identity的信息,模型数据就空了。
一步步修复
1. 先给Account/Index配好授权属性
你之前加AllowAnonymous是权宜之计,其实应该给它加[Authorize],这样只有登录用户能访问,也能帮我们验证登录后的身份是否正常:
[Authorize] public ActionResult Index() { // 你原来的代码不动 }
2. 检查登录后的身份有没有真的“生效”
你在var result=...那里看到Success,只是说明用户名密码对了,但系统可能没把登录状态存进Cookie里。咱们在Login方法的Success分支里加两行调试代码看看:
case SignInStatus.Success: // 临时加这两行,看看登录后身份状态 Debug.WriteLine($"当前用户是否已登录:{User.Identity.IsAuthenticated}"); Debug.WriteLine($"当前用户ID:{User.Identity.GetUserId()}"); // 原来的逻辑继续...
如果输出显示IsAuthenticated是false,那就是SignInManager没正确创建登录Cookie。这时候要检查:
- Startup里的中间件顺序是不是对的:
app.UseAuthentication()必须放在app.UseAuthorization()前面 - 有没有正确配置Cookie认证(比如在
ConfigureServices里加了services.AddAuthentication(CookieAuthenticationDefaults.AuthenticationScheme)...)
3. 把LoginPartial里的ReturnUrl改对
你现在用的是硬编码的../../Home/Account,这路径很容易出错。换成Url.Action生成正确的路由,就不会有路径解析问题了:
@using (Html.BeginForm("Login", "Account", new { ReturnUrl = Url.Action("Index", "Account") }, FormMethod.Post, new { @class = "form-horizontal", role = "form" }))
4. 手动强制生成登录身份(如果需要的话)
要是调试发现IsAuthenticated还是false,可能是PasswordSignInAsync没自动完成身份持久化。咱们手动调用SignInAsync来补这一步:
case SignInStatus.Success: // 先拿到当前用户对象 var user = await UserManager.FindByEmailAsync(model.Email); // 手动创建登录Cookie await SignInManager.SignInAsync(user, model.RememberMe, false); // 再执行原来的重定向逻辑 if (model.OrderId != null) { // 你原来的代码... } else { return RedirectToAction("Index", "Account"); }
有时候因为双因素验证或者其他配置,PasswordSignInAsync不会自动存Cookie,手动调用就解决了。
5. 关于Account/Index数据为空的问题
你加AllowAnonymous后数据为空,是因为此时你是匿名访问,User.Identity.GetUserId()自然是空的。等你把前面的问题解决,用户正常登录后访问Account/Index(带Authorize属性),User.Identity就有正确的信息了,模型数据也就加载出来了。
最后总结
按这个顺序排查:
- 给
Account/Index加上[Authorize] - 修正LoginPartial里的ReturnUrl生成方式
- 验证登录后的身份状态,必要时手动调用
SignInAsync - 检查Startup里的身份验证中间件顺序
应该就能解决登录成功却跳回登录页的问题,同时Account/Index也能正常加载用户数据啦。
内容的提问来源于stack exchange,提问作者extensionhelp

