在默认的 ASP.NET 核心项目中,为什么 "Forgot password" 功能会两次请求用户电子邮件?

In a default ASP.NET Core project, why does the "Forgot password" functionality ask for user email twice?

在 Visual Studio 2017 年,如果您创建一个新的 ASP.NET 核心 Web 应用程序(Razor 页面),配置为使用 个人用户帐户 在应用程序中存储用户帐户,"Forgot password"流程如下。

  1. 用户进入登录页面
  2. 用户点击"Forgot your password?"
  3. 用户输入电子邮件地址并单击 "Submit"
  4. 向用户发送一封电子邮件,其中包含 link 以重置密码。 link 包含用户 ID (Guid) 和用于重置的代码。
  5. 用户单击 link 并转到 "Reset password" 页面。
  6. 用户输入电子邮件、密码和确认密码,然后单击重置。

然后重置密码。

我的问题是,考虑到用户 ID 已经在 URL 中,是否存在某些特定原因要求用户在第 6 步中输入他的电子邮件。重置密码页面可以通过 ID 查找用户,而不是询问电子邮件地址。

我假设这是一个安全功能,以防有人拦截 link。但是拦截 link 可能意味着拦截包含 link 的电子邮件,然后用户电子邮件无论如何都会被知道。所以我觉得我错过了什么。

对我来说这听起来像是一个安全问题。

即使您可以查找用户 ID,也可以向他们显示他们的电子邮件,这将是更好的用户体验;让用户使用重置代码再次输入 his/her 电子邮件会稍微安全一些。这样密码重置仍然包含你知道的东西 你有的东西 在密码重置过程。您知道的是电子邮件地址,您拥有的是重置代码(可能还有用户 ID)。

如果不需要电子邮件 ,并且攻击者以某种方式获得了重置密码信息但不知道用户的电子邮件地址,攻击将能够使用 guid 和重置代码来重置密码。

如果需要电子邮件 并且攻击者不知道电子邮件地址,那么攻击者将无法重设密码仅包含重置信息(用户 id/code)。

密码重置并没有真正经常使用,也不一定是您网站中最用户友好的部分。最好更安全。