asp.net - 调用 GenerateChangePhoneNumberTokenAsync() 后身份电子邮件验证不起作用
问题描述
我最近在使用 asp.net 身份验证电子邮件时收到错误“无效令牌”。
我有详细的流程如下:
每当用户注册时,系统都会发送一封电子邮件以验证帐户。
string emailConfirmationToken = await _userManager.GenerateEmailConfirmationTokenAsync(userId);
注册完成后,用户无需验证邮箱即可添加手机号,系统将验证码发送至手机号。
string phoneNumberVerifyCode = await _userManager.GenerateChangePhoneNumberTokenAsync(loginUserId, model.phone);
问题是如果用户首先验证电话号码然后确认显示“令牌无效”错误的电子邮件,如果用户首先验证电子邮件然后“电话号码代码无效”。
你能帮我解决这个问题吗?
提前致谢!
解决方案
在创建用户帐户后立即创建电子邮件和 SMS 消息时,我遇到了类似的问题。如果先验证电话,电子邮件验证将失败。但是,如果首先验证电子邮件,则 SMS 验证在我的情况下仍然有效。
我最终做的(从帐户安全的角度来看更有意义)是在验证电话代码之前不发送电子邮件验证。这样,每当有人更改他们的电话号码时,我都会强制重新验证电子邮件,因为这会通知用户更改(如果发生 sim 攻击,他们会收到一封电子邮件)并保持第二种通信方式的验证。
我把E-mail的创建放到了短信验证方法中:
protected void Code_Click(object sender, EventArgs e)
{
if (!ModelState.IsValid)
{
ModelState.AddModelError("", "Invalid code");
return;
}
var manager = Context.GetOwinContext().GetUserManager<ApplicationUserManager>();
var signInManager = Context.GetOwinContext().Get<ApplicationSignInManager>();
var result = manager.ChangePhoneNumber(User.Identity.GetUserId(), PhoneNumber.Value, Code.Text);
if (result.Succeeded)
{
var userInfo = manager.FindById(User.Identity.GetUserId());
if (userInfo != null)
{
signInManager.SignIn(userInfo, isPersistent: false, rememberBrowser: false);
// force 2FA login with successful phone number
manager.SetTwoFactorEnabled(User.Identity.GetUserId(), true);
// force new cell phone changes to un-confirm & re-verify email for security reasons
userInfo.EmailConfirmed = false;
var EmCode = manager.GenerateEmailConfirmationToken(User.Identity.GetUserId());
var callbackUrl = IdentityHelper.GetUserConfirmationRedirectUrl(EmCode, User.Identity.GetUserId(), Request);
manager.SendEmail(User.Identity.GetUserId(), "Confirm your account", "A phone number has been added to your account. For security reasons, please confirm your email by clicking <a href=\"" + callbackUrl + "\">here</a>.");
Response.Redirect("/Account/Manage?m=AddPhoneNumberSuccess");
}
}
ModelState.AddModelError("", "Failed to verify phone");
}
如果电子邮件验证比 SMS 更重要,但两者都需要,您也可以相反,将 SMS 代码发送放在电子邮件验证方法中。在我的情况下,电话号码比电子邮件更重要,因此它在注册过程中具有优先权。
现在回想起来,我很高兴它没有按照我最初计划的方式工作,因为这种方法更简单,用户不太可能忘记做其中一个。这个解决方案会引导他们完成它,而不是用任务轰炸用户。
推荐阅读
- git - 如何强制 git 在克隆请求时提示我输入用户名 + 密码
- ssl - 在 localhost 中测试 TLS:证书对给定域无效
- c# - 在哪里可以找到 SaveFileDialog 的选定文件路径(C#,Visual Studio)
- java - 如何将 MultipartFile 文件的内容转换为 JSON 字符串
- python - 在Python中迭代所有组合
- spring - 带有注释的 Spring Boot 验证
- python - 减去两列 DataFrames 没有给出预期的结果 - Python,Pandas
- javascript - 从页面 Javascript 回调到扩展
- java - 当我们在 java 中创建一个 setter 方法时,java 如何知道我们要将 setter 中的给定值设置到哪个变量?请阅读说明
- swift - PassthroughSubject 没有初始值