【问题标题】:ASP MVC ConfirmEmailAsync not workingASP MVC ConfirmEmailAsync 不起作用
【发布时间】:2017-12-07 00:34:30
【问题描述】:

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

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>

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

    [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.Succeeded 就是true。

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

锁定。

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

我做错了什么?我需要手动更改数据库中的锁定标志吗?如果是这样,ConfirmEmailAsync 方法的意义何在?

【问题讨论】:

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


    【解决方案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 标志为真。您可以通过在 UserManager 上调用 SetLockoutEnabledAsync 方法将其设置为 false。

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

    【讨论】:

    • 打电话给SetLockoutEnabledAsync(userId, false),谢谢!
    【解决方案2】:

    起初,我在让这些工作时遇到了挑战,经过一系列研究后没有成功。最后,我找到了问题的根源并修复了它们,从而分享了我的经验。遵循以下流程,我相信它会有所帮助。

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

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

    第 2 步用于 GenerateEmailConfirmationTokenAsync() / ConfirmEmailAsync() 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()

      一个。

       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");
       }
      

    【讨论】:

      猜你喜欢
      • 2016-04-04
      • 1970-01-01
      • 1970-01-01
      • 2021-08-04
      • 2016-11-15
      • 2019-03-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多