【问题标题】:Best practice to send a member their forgotten password向会员发送忘记密码的最佳做法
【发布时间】:2015-10-20 07:23:45
【问题描述】:

我正在 Umbraco 7.1.7 中为我们的会员区建立登录/注册部分。

我想通过电子邮件以纯文本向用户发送他们的密码。

这个想法是,如果用户忘记了他们的密码,他们可以简单地输入他们的电子邮件地址(这也是他们的用户名)并点击按钮:
现在,我知道 Umbraco 使用 ASP.NET Membership Provider 并散列密码,这很好,但我需要访问纯文本版本才能在电子邮件中发送。

我已更改我的 web.config 以包含以下内容:

<membership defaultProvider="UmbracoMembershipProvider" userIsOnlineTimeWindow="15">
     <providers>
       <clear />
       <add name="UmbracoMembershipProvider" 
            type="Umbraco.Web.Security.Providers.MembersMembershipProvider, Umbraco" 
            minRequiredNonalphanumericCharacters="0" 
            minRequiredPasswordLength="0" 
            useLegacyEncoding="true" 
            enablePasswordRetrieval="true" 
            enablePasswordReset="true" 
            requiresQuestionAndAnswer="false" 
            defaultMemberTypeAlias="Member" 
            passwordFormat="clear" />

而我的 Controller Action 方法如下所示:

// Forgot password logic to send email
[ActionName("MvcMemberForgot")]
public ActionResult MvcMemberForgot(MvcMemberForgotModel model)
{
    string emailaddress = model.Email.ToString();    // The users entered email address.
    var member = Services.MemberService.GetByEmail(emailaddress);

    var sb = new StringBuilder();   // To build the message.
    sb.Append("Here is the password you chose for this email address: ");  
    sb.Append(password);  // I need a password value here...

    // Send the email.  
    library.SendMail("noreply@company.co.uk", emailaddress, "Password", sb.ToString(), true);
    return CurrentUmbracoPage();
}

我可以使用var x = member.RawPasswordValue;返回散列密码,有没有办法获取用户以类似方式注册时输入的密码?

【问题讨论】:

  • 密码永远不应以纯文本形式发送。请参阅Security.SE 上的此问题,其中提到向用户发送纯文本密码。
  • 您说得对,先生,我已经用一些更好的建议修改了我的答案。感谢您向我指出这一点:)
  • 只是出于兴趣,您是否对我的问题投了反对票,因为我对以纯文本形式发送密码有错误的想法,或者不清楚或其他什么?我想知道所以我不会再犯同样的错误,我还在学习所以再次感谢您的帮助。 :)
  • @RyanEmerle 很好地解释了为什么通用哈希不能胜任任务。

标签: c# model-view-controller membership-provider umbraco7 password-recovery


【解决方案1】:

我不会以纯文本形式向人们发送电子邮件,这是非常糟糕的安全做法。我最近处理这个问题的方法是执行以下操作:

  • 为成员(标签)添加一个属性,用于存储重置时间戳
  • 有一个重置请求表单,通过电子邮件地址验证用户,然后将标签设置为未来 30 分钟的时间戳
  • 向会员发送一封电子邮件,其中包含指向另一个表单页面的链接,并传递他们的电子邮件和时间戳
  • 在表单上,​​获取电子邮件和时间戳,验证电子邮件是否存在,并且时间戳尚未过期
  • 如果他们通过了这些测试,请让他们选择输入并确认一个新密码,然后您将其保存在用户面前(同时清除标签上的时间戳)

我的方法基于此示例代码库中的代码:https://github.com/warrenbuckley/CWS-Umbraco-Standard-Membership,其中包含许多与成员合作的有用示例!

【讨论】:

  • 感谢您提供简明扼要的回答,以及有关安全性的一般性建议。该链接也很有用。
  • 那么是什么阻碍了黑客请求重置密码,然后自己发送带有时间戳的电子邮件,时间戳是可预测的不是吗?
  • 没什么大不了的,但在获取确切的时间戳时可能会出现一些试验和错误(由于黑客/服务器时间设置的差异)。如果您想增加额外的安全性,您也可以加密时间戳?或者有两个属性,一个是时间戳,只是用于检查,使用更安全的东西来验证重置而不是时间戳。
猜你喜欢
  • 2012-11-30
  • 2010-10-06
  • 2010-12-31
  • 2020-09-23
  • 1970-01-01
  • 1970-01-01
  • 2016-08-31
  • 2011-02-19
  • 2011-02-23
相关资源
最近更新 更多