Asp.net “为”编写代码的最佳方法;“忘记密码”;

Asp.net “为”编写代码的最佳方法;“忘记密码”;,asp.net,security,passwords,Asp.net,Security,Passwords,net网站,我想实现忘记密码。我正在使用以下步骤 具有登录Id、电子邮件Id和验证码输入框的表单 当用户输入详细信息并提交时,在验证后的后端将生成新密码并替换数据库中的旧密码 新密码通过电子邮件发送给用户 请帮我看看我做得对不对 是否有其他安全机制用于相同的目的 [编辑] 谢谢,我收到了你的答复。实际上,这是一种安全机制。但在这里我没有什么疑问 当用户在忘记密码页面输入loginId和电子邮件地址时,我应该向他显示什么消息 有效用户和恶意用户的消息是否相同 使用CSRF令牌的优势?有任何帮助/链

net网站,我想实现忘记密码。我正在使用以下步骤

  • 具有登录Id、电子邮件Id和验证码输入框的表单
  • 当用户输入详细信息并提交时,在验证后的后端将生成新密码并替换数据库中的旧密码
  • 新密码通过电子邮件发送给用户
  • 请帮我看看我做得对不对

    是否有其他安全机制用于相同的目的

    [编辑] 谢谢,我收到了你的答复。实际上,这是一种安全机制。但在这里我没有什么疑问

  • 当用户在忘记密码页面输入loginId和电子邮件地址时,我应该向他显示什么消息
  • 有效用户和恶意用户的消息是否相同
  • 使用CSRF令牌的优势?有任何帮助/链接吗
  • 当用户点击链接时,我该怎么做;因为我猜用户应该自动登录到他们的帐户-然后我有2个选择(第一个)自动发送新密码给用户(第二个)新表单将显示给用户,用户将在其中输入旧密码和新密码两次

  • 请提供帮助?

    实现这一点的方法有很多。正如您所说,生成新密码并将其发送到注册的电子邮件地址是一种方法。但我不建议你这么做,因为每次有人试图猜我的密码时,我的密码都会被重置

    相反,到目前为止,我所看到的最好的事情就是简单地用一个链接发送注册的电子邮件,该链接将开始密码重置过程。您甚至可以通过显示注册中使用的电子邮件地址的屏蔽版本,让用户知道要检查哪个电子邮件地址:

    已将电子邮件发送至
    ******
    @hotmail.com。请检查您的收件箱以继续


    请务必考虑那些可能忘记注册电子邮件地址的人——通常一些安全问题是提供这些信息的好方法。

    我最近已经这样做了。当用户输入用户名或电子邮件地址时,我们会生成一个唯一的令牌,并将其作为链接的一部分发送给他们。收到该电子邮件后,他们单击链接,并自动登录,进入“我的帐户”屏幕,并提示重置密码


    当然,这100%依赖于电子邮件客户端的安全性,但从可用性的角度来看,这是很难克服的。

    我可以理解为什么您需要验证码,但我会采取不同的方法

  • 当要求重置密码时,请检查该帐户在过去X分钟内是否尚未要求重置密码。如果已请求密码,则忽略重置请求
  • 检查请求密码重置的IP。如果该IP在过去Y分钟内请求重置密码,则忽略该请求
  • 如果签入1和2通过检查,则检查帐户是否存在。如果它不忽略请求
  • 如果到目前为止,我们已经生成了一个一次性令牌,它将在Z分钟内过期,并生成一个包含该令牌的密码重置URL。将此邮件发送到注册的电子邮件地址。加载URL时,提示输入新密码并重置
  • 对于那些认为你应该告诉用户电子邮件去了哪里的人,我强烈反对。这是“信息泄露”,即使你把它限制在域名上。例如,假设我在JeffAtwoodEatsBabies.com上注册为blowdart。如果Jeff要求为我重置密码,而你显示了注册域,那么他会看到idunno.org。这是我的个人领域,因此Jeff知道blowdart用户实际上就是我。这是一件坏事。我不必使用hotmail或gmail或其他任何方式注册,以保护自己免受您向所有人显示电子邮件域的代码的攻击

    此外,您根本不应该显示错误消息。无论发生什么情况,用户名实际上没有注册,或者发出了太多请求,或者天塌下来,您都应该告诉用户密码重置过程已经开始。通知用户帐户不存在会导致更多信息泄漏

    您可以做的最后一件事是将CSRF令牌添加到重置请求页面,这样就不能从其他网站驱动它

    后续行动

    来回答你们进一步的问题

  • 你要传达什么信息取决于你自己。“重置密码的说明已通过电子邮件发送到此帐户的注册电子邮件”是一个想法,但实际上这取决于您的受众
  • 上面已经提到
  • 维基百科是一个很好的工具。你如何做到这一点取决于你的平台,这完全是另一个问题!对于ASP.NET,您可以查看我的codeplex项目,或者查看
  • 当点击链接时,我会首先根据它所应用的用户名验证URL中的令牌,然后我会允许用户输入一个新密码,或者生成一个新密码并通过电子邮件发送给它。您不能提示输入旧的,因为关键是用户已经忘记了
    您应该检查问题的答案:from on security.stackexchange


    这是我在这个问题上找到的最完整的答案。我也建议你阅读这篇文章:

    + 1考虑用户注册foo@bar.com说“我们在您使用的电子邮件地址向您发送了一个链接…以foo@开头”有任何安全问题吗。。。对这一策略有何评论?@pcampbell-+1我真的很喜欢这个想法,因为我有时想知道我注册的电子邮件是什么,但我认为更好的方法是提供域名而不是电子邮件地址(@hotmail.com,@yahoo.com,@gmail.com),因为我认为大多数人可能都有相同的电子邮件地址,只是在不同的提供商。我喜欢看到我的电子邮件地址的伪装版本。我已经更新了我的帖子来反映这一点。你的意思是,首先我需要验证用户电子邮件,然后如果验证通过了,我就需要验证