我正在尝试为用户提供更改电子邮件的能力。我也想发送一封验证电子邮件,他们可以在其中验证/确认电子邮件。
我只是想进一步了解有关此流程的更多信息,但我无法在线找到合理的文档。
我看到这样的流程:
- 用户输入他们希望使用的新电子邮件
- 代码/令牌与确认电子邮件共同创建(新电子邮件尚未应用于用户)
- 确认电子邮件已发送到新电子邮件
- 用户确认/验证他们的新电子邮件
- 在控制器中收到新的电子邮件和代码,调用
UserManager.ChangeEmailAsync(User user, string newEmail, string code)
是调用 ChangeEmailAsync()
方法时应用于用户的新电子邮件,或者在发送确认电子邮件之前,我必须应用新电子邮件(设置EmailConfirmed
返回false
)?
尝试以下操作: tring code = await UserManager.GenerateUserTokenAsync("ChangeEmail",userID);
在将新电子邮件发送到新电子邮件中,并将新电子邮件保存在临时表中
用户确认新电子邮件时的功能:
public async Task<IHttpActionResult> ChangeEmail(ChangeEmailModel model)
{
try
{
HttpUtility.UrlEncode(model.Code);
if ( !UserManager.VerifyUserToken(model.UserId, "ChangeEmail", model.Code)) //to verify the code
{
_logger.Error($"token expired");
return ResponseMessage(Request.CreateResponse(HttpStatusCode.BadRequest, new KeyValuePair<String, String>(Messages.ExpiredLink, CommonMessages.ExpiredLink)));
}
else
{
UserDetailsManager userDetailsManager = new UserDetailsManager();
string Email = userDetailsManager.GetNewEmail(model.UserId);//get the new email from the temporary table
var user = await UserManager.FindByIdAsync(model.UserId);
user.Email = Email;//change the email
user.UserName = Email;
result = await UserManager.UpdateAsync(user);
if (!result.Succeeded)
{
foreach (var item in result.Errors)
{
if (item.Contains("already"))
{
_logger.Info("In ChangeEmail user already exists");
return ResponseMessage(Request.CreateResponse(HttpStatusCode.BadRequest, new KeyValuePair<String, String>(Messages.EmailUserExist, CommonMessages.EmailUserExist)));
}
}
}
}
}
}
catch (Exception ex)
{
_logger.Error($"In ChangeEmail Error - {ex.Message} return {HttpStatusCode.InternalServerError}");
return ResponseMessage(Request.CreateResponse(HttpStatusCode.InternalServerError, new KeyValuePair<String, String>(Messages.InternalServerError, CommonMessages.InternalServerError)));
}
_logger.Info($"ChangeEmail end status {HttpStatusCode.OK} ");
return Ok("Success");
}`
此功能还覆盖了对确认书的关注