如何在使用ASP.NET标识确认帐户后执行自动登录

本文关键字:执行 登录 标识确认 NET ASP | 更新日期: 2023-09-27 17:59:13

我目前正在开发一个MVC5 web应用程序,使用ASP.NET Identity 2进行帐户控制,我担心的具体问题是在电子邮件确认后自动登录用户

因此流程如下:

  1. 用户单击"注册"链接
  2. 输入电子邮件(用户名)/密码,点击注册
  3. 将向给定地址发送一封带有"请确认帐户"URL的电子邮件
  4. 用户单击链接,确认电子邮件地址并自动登录

控制器上的确认电子邮件操作如下所示:

[AllowAnonymous]
public async Task<ActionResult> ConfirmEmail(string userId, string code)
{
   // If userId or code is empty, show an error or redirect
   if (userId == null || code == null)
   {
     return View("Error");
   }
   // Attempt to confirm the email address
   var confirmEmailResult = await UserManager.ConfirmEmailAsync(userId, code);
   // Retrieve the user (ApplicationUser)
   var user = await UserManager.Users.FirstOrDefaultAsync(u => u.Id == userId);
   if (user == null)
   {
     // If the user doesn't exist, redirect home
     return RedirectToAction("Index", "Home");
   }
   // If the confirmation succeeded, sign in the user and redirect to this profile page
   if (confirmEmailResult.Succeeded)
   {
     await SignInManager.SignInAsync(user, false, false);
     var url = Url.Action("Profile", "User");
     return RedirectToLocal(url);
   }
   // In all other cases, redirect to an error page
   return View("Error");
}

奇怪的是,出于某种原因,如果我同时确认电子邮件,我可以登录用户。。。它不起作用。具体来说,我在这行得到一个TimeOutException:

await SignInManager.SignInAsync(user, false, false);

这非常令人难以置信,因为我知道数据库和应用服务器不是问题所在。

我是不是搞错了。。。?

提前感谢!

如何在使用ASP.NET标识确认帐户后执行自动登录

好的,答案已经找到,问题如下,对于每个请求,都要设置一个级别为Read Commited的事务。这导致第二次更改(创建)被第一次更改(电子邮件确认)阻止,导致超时。。。

async Task IRunBeforeEachRequest.Execute()
{
  _HttpContext.Items[IdentityContextTransactionKey] = _IdentityContext.Database.BeginTransaction(IsolationLevel.ReadCommitted);
  _HttpContext.Items[TravellersContextTransactionKey] = _TravellersContext.Database.BeginTransaction(IsolationLevel.ReadCommitted);
}

再次感谢您的帮助!