ASP MVC ConfirmEmailAsync无法正常工作

时间:2017-12-07 00:34:31

标签: c# asp.net asp.net-mvc asp.net-identity

我注册用户,通过电子邮件接收令牌,如下所示:

Please confirm your account by clicking <a href="http://localhost:11080/Account/ConfirmEmail?userId=51d95921-c240-4025-ac38-7dfc08a1012f&code=Jc58CjzNK6mkeaFT0U7iO68aKP4OrQtYWY9AWCkJtWpnc948kiR%2Bxq9PnptItf1kpKjgi0OyZdguBwCvePOQ%2Bf5P3IPTZwdVA%2FEJ%2F6A9iscTKjDcR2Q9bJH%2FH76S5h1W0lsSSLxfad2Bjrr4H%2BySgP70uktmZIUkhQXnIJN1%2BqBuJ9EfWeuytOfbv1i%2FkNtV">here</a>

点击该链接,我可以看到ConfirmEmail中的AccountController方法触发:

    [AllowAnonymous]
    public async Task<ActionResult> ConfirmEmail(string userId, string code)
    {
        if (userId == null || code == null)
        {
            return View("Error");
        }
        var result = await UserManager.ConfirmEmailAsync(userId, code);
        return View(result.Succeeded ? "ConfirmEmail" : "Error");
    }

result.Succeededtrue

一切似乎都很好,但在完成此过程后尝试登录时,我会转到该页面,告诉我我的帐户已被锁定

  

锁定。

     

此帐户已被锁定,请稍后再试。

我可能做错了什么?我是否需要手动更改数据库中的锁定标志?如果是这样,那么ConfirmEmailAsync方法有什么意义呢?

2 个答案:

答案 0 :(得分:1)

ConfirmEmailAsync只需将用户帐户记录中的EmailConfirmed设置为true即可。从UserManager(为简洁起见编辑):

public virtual async Task<IdentityResult> ConfirmEmailAsync(TUser user, string token)
{
    ...
    var store = GetEmailStore();
    ...
    await store.SetEmailConfirmedAsync(user, true, CancellationToken);
    return await UpdateUserAsync(user);
}

GetEmailStore返回IUserEmailStore的位置(默认情况下由UserStore执行),sets the flag

public virtual Task SetEmailConfirmedAsync(TUser user, bool confirmed, CancellationToken cancellationToken = default(CancellationToken))
{
    ...
    user.EmailConfirmed = confirmed;
    return Task.CompletedTask;
}

您收到的错误表明用户帐户上的LockoutEnabled标记为true。您可以通过调用SetLockoutEnabledAsync上的UserManager方法将其设置为false。

SupportsUserLockout上还有一个UserManager标记,默认情况下会在创建时解锁帐户。要设置此项,您需要创建自己的UserManager并将此标记覆盖为false。

答案 1 :(得分:1)

起初,我面临着使这些方法工作的挑战,经过一系列研究后没有成功。最终,我找到了问题的根源并加以解决,从而分享了我的经验。请按照以下过程操作,我相信它会有所帮助。

步骤1 转到Startup.cs并删除以下代码(如果已初始化);

services.Configure<RouteOptions>(options =>
{
     options.LowercaseUrls = true;
     //options.LowercaseQueryStrings = true; //(comment or remove this line)
});

GenerateEmailConfirmationTokenAsync()/ ConfirmEmailAsync()的步骤2 2a。在注册新用户以生成令牌时,照常进行;

var originalCode = await userManager.GenerateEmailConfirmationTokenAsync(user);
var code = HttpUtility.UrlEncode(originalCode);
var confirmationLink = Url.Action("ConfirmEmail", "Account",
                                      new { userId = user.Id, token = code }, Request.Scheme);

2b。收到用于电子邮件确认的confrimationLink后,照此进行

var originalCode = HttpUtility.UrlDecode(token);
var result = await userManager.ConfirmEmailAsync(user, originalCode);
if (result.Succeeded)
{
    return View(); //this returns login page if successful
}
  1. 对于GeneratePasswordResetTokenAsync()ResetPasswordAsync()

    a。

     var originalCode = await userManager.GeneratePasswordResetTokenAsync(user);
     var code = HttpUtility.UrlEncode(originalCode);
     var passwordResetLink = Url.Action("ResetPassword", "Account",
                             new { email = model.Email, token = code }, Request.Scheme);
    

    b。

     var orginalCode = HttpUtility.UrlDecode(model.Token);
     var result = await userManager.ResetPasswordAsync(user, orginalCode, model.Password);
     if (result.Succeeded)
     {
         return View("ResetPasswordConfirmation");
     }