在Visual Studio 2017中,如果创建新的 ASP.NET 核心Web应用程序(Razor Pages),配置为使用个人用户帐户和在应用程序中存储用户帐户,则"忘记密码"流如下所示。
- 用户转到登录页面
- 用户点击"忘记密码?
- 用户输入电子邮件地址,然后单击"提交">
- 将向用户发送一封电子邮件,其中包含用于重置密码的链接。此链接包含用户 ID (Guid) 和用于重置的代码。
- 用户单击链接并转到"重置密码"页面。
- 用户输入电子邮件、密码和确认密码,然后单击重置。
然后重置密码。
我的问题是,考虑到用户 ID 已经在 URL 中,是否有一些特定原因要求用户在步骤 6 中输入他的电子邮件。重置密码页面可以通过 id 查找用户,而不是询问电子邮件地址。
我认为这是一项安全功能,以防有人拦截链接。但是拦截链接可能意味着拦截包含链接的电子邮件,然后无论如何都会知道用户的电子邮件。所以我觉得我错过了什么。
对我来说听起来像是一个安全问题。
即使你可以查找用户ID,向他们展示他们的电子邮件,这将是一个更好的用户体验;让用户再次输入他/她的电子邮件和重置代码会更安全一些。 这样,密码重置仍包含您知道的内容,以及您必须在密码重置过程中对用户进行身份验证的内容。 你知道的是电子邮件地址,你拥有的东西是重置代码(可能还有用户ID)。
如果不需要电子邮件,并且攻击者以某种方式掌握了重置密码信息,但不知道用户的电子邮件地址,则攻击将能够使用 guid 和重置代码来重置密码。
如果需要电子邮件并且攻击者不知道电子邮件地址,则攻击者将无法仅使用重置信息(用户 ID/代码)重置密码。
密码重置并不经常使用,也不一定是您网站中最用户友好的部分。 最好更安全。