【问题标题】:Change email using UserManager.ChangeEmailAsync()使用 UserManager.ChangeEmailAsync() 更改电子邮件
【发布时间】:2018-09-06 22:28:19
【问题描述】:

我正在尝试让我的用户能够更改电子邮件。我也想发送一封验证电子邮件,他们可以在其中验证/确认他们的电子邮件。

我只是想了解更多关于这个流程的信息,我一直无法在网上找到合理的文档。

我看到这样的流程:

  1. 用户输入他们希望使用的新电子邮件
  2. 代码/令牌与确认电子邮件一起创建(新电子邮件尚未应用于用户)
  3. 确认邮件已发送至新邮箱
  4. 用户确认/验证他们的新电子邮件
  5. 在控制器中收到新的电子邮件和代码,并调用 UserManager.ChangeEmailAsync(User user, string newEmail, string code)

是在调用ChangeEmailAsync()方法时将新电子邮件应用到用户,还是在发送确认电子邮件之前我必须应用新电子邮件(设置EmailConfirmed返回到false)?

【问题讨论】:

  • 查看此 ^^^^ 问题的第二个答案 - 谈论通过链接确认电子邮件。
  • 我在将其视为最佳实践时遇到了问题,因为您只是向用户类添加了一个新属性。此外,这不是使用UserManager.ChangeEmailAsync 方法,这只是从带有标识的新MVC 附带的ConfirmEmail 脚​​手架中复制功能。如果没有其他使用ChangeEmailAsync的例子,我想我需要像他那样做。

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


【解决方案1】:

试试这个: tring code = await UserManager.GenerateUserTokenAsync("ChangeEmail",userID); 在 SendingEmail() 到新电子邮件并将新电子邮件保存在临时表中

用户确认新邮件时的功能: `

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

这个函数也覆盖了对 confirmEmail 的关注

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-05-10
    • 2014-04-30
    • 2022-01-11
    • 1970-01-01
    • 2017-11-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多