由于更改了Securitystamp

时间:2016-03-23 15:56:11

标签: asp.net asp.net-mvc-5 asp.net-identity-2

我一直在墙上撞了一段时间关于这个问题:

我有一个带ASP.NET Identity 2.2.1的ASP.NET MVC 5.2.3 Web应用程序。我想强迫用户

  1. 验证他们的电子邮件地址和
  2. 验证他们的手机号码。
  3. 因此,当用户注册该应用程序时,会生成emailVerification令牌并将其发送给用户。 之后,用户将被重定向到Manage控制器中的VerifyPhoneNumber端点。生成SMS代码并将其发送给用户。用户被要求输入SMS代码。代码已经过验证。 但是,如果用户收到带有电子邮件验证码的电子邮件并单击该链接,则无法再验证令牌(无效令牌)。

    据我了解,这是因为调用UserManager.ChangePhoneNumberAsync会更改用户的SecurityStamp。如果电话验证未激活,则电子邮件验证效果很好。更具体地说,当没有调用ChangePhoneNumberAsync时。

    非常感谢任何关于如何防止SecurityStamp更改或允许对初始注册进行验证的想法。

    VerifyPhoneNumber

    public async Task<ActionResult> VerifyPhoneNumber(VerifyPhoneNumberViewModel model)
    {
        if (!ModelState.IsValid)
        {
            return View(model);
        }
        var userId = User.Identity.GetUserId();
        var result = await UserManager.ChangePhoneNumberAsync(userId, model.PhoneNumber, model.Code);
        if (result.Succeeded)
        {
            var user = await UserManager.FindByIdAsync(userId);
            if (user != null)
            {
                await SignInManager.SignInAsync(user, isPersistent: false, rememberBrowser: false);
                return RedirectToAction("Index", "Home");
            }
            else
            {
                return RedirectToAction("Index", new { Message = ManageMessageId.AddPhoneSuccess });
            }
        }
        // If we got this far, something failed, redisplay form
        ModelState.AddModelError("", "Could not verify phone number.");
        return View(model);
    }
    

    ConfirmEmail

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

0 个答案:

没有答案