我一直在墙上撞了一段时间关于这个问题:
我有一个带ASP.NET Identity 2.2.1的ASP.NET MVC 5.2.3 Web应用程序。我想强迫用户
因此,当用户注册该应用程序时,会生成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");
}