Asp.net mvc AspNet核心生成和更改电子邮件地址

Asp.net mvc AspNet核心生成和更改电子邮件地址,asp.net-mvc,asp.net-core,asp.net-core-mvc,Asp.net Mvc,Asp.net Core,Asp.net Core Mvc,我正在尝试为用户实现一种在AspNetCore中更改电子邮件的方法,因此在帐户管理屏幕上,我具有更改功能,该功能将在用户管理器上调用GenerateChangeEmailTokenAsync,然后使用包含令牌和用户ID的链接发送电子邮件 我的问题是如何允许将电子邮件地址更改为新地址的链接,因为ChangeEmailAsync要求输入新的电子邮件地址 实现此功能的最佳实践方式是什么?我不想在电子邮件链接中发送新的电子邮件地址,但也不想让他们再次键入电子邮件。希望有人这样做了,我不能在任何地方找到它

我正在尝试为用户实现一种在AspNetCore中更改电子邮件的方法,因此在帐户管理屏幕上,我具有更改功能,该功能将在用户管理器上调用GenerateChangeEmailTokenAsync,然后使用包含令牌和用户ID的链接发送电子邮件

我的问题是如何允许将电子邮件地址更改为新地址的链接,因为ChangeEmailAsync要求输入新的电子邮件地址


实现此功能的最佳实践方式是什么?我不想在电子邮件链接中发送新的电子邮件地址,但也不想让他们再次键入电子邮件。希望有人这样做了,我不能在任何地方找到它,它应该非常简单。

正常的流程是让用户像往常一样更新配置文件

如果用户更新了他们的电子邮件地址,则需要验证新的电子邮件地址

这就是使用
generateChangeMailTokenAsync
生成令牌的时候

您将该令牌作为指向新电子邮件地址的链接发送

var result = await _userManager.ChangeEmailAsync(user, newEmail, token);

当用户单击新电子邮件中的链接时,它会将他们带回您的站点,该站点会自动确认令牌并验证新电子邮件地址。

我知道回答这个问题很晚,但我以前自己也在寻找,我想我会将答案留给其他人

GenerateChangeEmailTokenAsync方法将新电子邮件作为令牌哈希的一部分。 接下来,创建一个包含令牌、新电子邮件和旧电子邮件的链接

 var token = await _userManager.GenerateChangeEmailTokenAsync(user, model.NewEmail);
 var resetLink = Url.Action("ChangeEmailToken", "account", new {token = token, oldEmail = user.Email, newEmail = model.newEmail }, protocol: HttpContext.Request.Scheme);
接下来,通过电子邮件将此链接发送给用户

单击时,用户点击链接中命名的方法(此处为AccountController上的“ChangeEmailToken”:

 [AllowAnonymous]
 [HttpGet]
 public async Task<IActionResult> ChangeEmailToken([FromQuery] string token, [FromQuery] string oldEmail, [FromQuery] string newEmail)

是的,这就是我得到的,但我缺少的部分它如何验证新的电子邮件地址。新地址没有存储在任何地方,因此当他们单击带有令牌的链接时,应用程序不知道新地址是什么。我应该如何获得该电子邮件地址?帐户应该有一个电子邮件字段/列。这就是您必须停止的地方当他们注册/创建帐户时,请将电子邮件地址改为红色。然后,正如我上面所述。如果他们更新了帐户,并且电子邮件地址已更改,则您需要通过电子邮件确认流程。在他们单击电子邮件中的链接之前,电子邮件列不会更改。这确保他们不会被困在帐户之外在等待确认新电子邮件时卸载。这也意味着新电子邮件不会存储在数据库中的任何位置。我认为最好的方法可能是为未确认的电子邮件添加一个新列。然后在他们单击链接时将其拉入。通常会有一个
emailconfirm
布尔列用于此目的。是的。我曾考虑过这一点,但GenerateChangeEmail令牌不会更改电子邮件地址,但“确认”会更改它。另外,如果他们更改了电子邮件地址,但其中有未确认的电子邮件,则在再次确认之前,他们将无法登录或接收警报(可能需要一段时间)。因此,我需要一种方法,允许用户继续使用他/她的旧电子邮件,直到他们确认新电子邮件。您可以使用
\u userManager.changemailasync(user,newEmail,token)
,而不是手动验证和更新。谢谢Axel,我没有看到。更新了示例