密码恢复无需通过电子邮件发送密码

所以,我一直在玩asp:PasswordRecovery并发现我真的不喜欢它,原因有以下几点:

1)即使无法访问Alice的电子邮件,也可以重置Alice的密码。 密码重置的安全问题减轻了这一点,但并不能让我满意。

2)Alice的新密码以明文forms发回给她。 我想向她发送一个特殊链接到我的页面(例如像example.com/recovery.aspx?P=lfaj0831uefjc这样的页面),这会让她更改她的密码。

我想我可以通过创建某种过期密码恢复页面表并将这些页面发送给要求重置的用户来自行完成。 不知何故,这些页面也可以在幕后更改用户密码(例如,通过手动重置它们然后使用新密码的文本来更改密码,因为密码在不知道旧密码的情况下无法更改)。 我确定其他人之前遇到过这个问题,这种解决方案让我觉得有点笨拙。 有一个更好的方法吗?

理想的解决方案不会通过直接访问数据库来违反封装,而是使用数据库中的现有存储过程……尽管这可能是不可能的。

我目前正在Spring + SpringSecurity之上实现一个开源用户管理系统 ,这就是我如何解决丢失的密码问题。

  1. 用户的帐户必须具有预先注册的电子邮件地址。
  2. 要请求重置,用户将其帐户名称输入表单。
  3. 生成临时“重置代码”并将其附加到帐户,并通过电子邮件发送给嵌入在超链接中的用户。
  4. 收到电子邮件后,用户单击链接,将他们带到页面以输入新密码。
  5. 在接受新密码之前,将根据存储的代码检查重置代码(来自链接),以确保它是正确的并且没有过期。

这可以避免在电子邮件中发送密码(明文)。 并且它还防止一个人重置另一个人的密码只是为了讨厌,因为密码重置仅在链接被使用后发生。

但它依赖于用户的电子邮件帐户是安全的,并且在电子邮件中不会在传输过程中被窥探。 对于某些应用,这可能是不可接受的风险。

另一方面是您需要非常小心地更改用户的注册电子邮件地址。 至少,用户必须输入他们当前的密码以及更改地址的请求…以防止通过无人参与的登录会话进行黑客攻击。

我建议添加额外级别的检查,以下是一些可供选择的选项。

  1. 首先,您可以将请求者的IP地址保存在数据库中,然后当他们单击重置链接时将其与当前计算机的IP地址进行比较,如果匹配则重置密码。 如果电子邮件被截获,则尝试重置密码的人必须具有匹配的IP地址。
  2. 使用cookie并存储唯一值,可能是GUID,MD5哈希等。 因此,当用户进行密码重置请求时,cookie将存储在其计算机和数据库中,当用户单击该链接时,本地cookie必须与数据库值匹配,否则他们将无法重置其密码。

一般来说,我完全反对在电子邮件中发送密码,所以我更喜欢密码重置链接选项而不是新的纯文本密码。