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

时间:2009-06-24 21:48:29

标签: c# asp.net .net-2.0 asp.net-membership passwords

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

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

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

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

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

2 个答案:

答案 0 :(得分:4)

我目前正在Spring + SpringSecurity之上实现一个开源user management system,这就是我如何解决丢失的密码问题。

  1. 用户的帐户必须有预先注册的电子邮件地址。
  2. 要请求重置,用户会将其帐户名称输入表单。
  3. 生成临时“重置代码”并附加到帐户,并通过电子邮件发送给嵌入在超链接中的用户。
  4. 收到电子邮件后,用户点击链接,将他们带到页面输入新密码。
  5. 在接受新密码之前,会根据存储的代码检查重置代码(来自链接),以确保它是正确的并且没有过期。
  6. 这可以避免在电子邮件中发送密码(明文)。它还可以防止一个人重置另一个人的密码只是为了讨厌,因为密码重置只发生在链接使用后。

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

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

答案 1 :(得分:2)

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

  1. 首先,您可以将请求者的IP地址保存在数据库中,然后当他们单击重置链接时将其与当前计算机的IP地址进行比较,如果匹配则重置密码。如果电子邮件被拦截,则尝试重置密码的人必须具有匹配的IP地址。
  2. 使用cookie并存储唯一值,可能是GUID,MD5哈希等。因此,当用户进行密码重置请求时,cookie会存储在他们的计算机和数据库中,当用户单击该链接时,本地cookie必须与数据库值匹配,否则他们将无法重置密码。
  3. 总的来说,我完全反对在电子邮件中发送密码,所以我更喜欢密码重置链接选项而不是新的纯文本密码。