c# - 向成员(member)发送忘记密码的最佳做法

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

我正在 Umbraco 7.1.7 中为我们的成员(member)区构建一个登录/注册部分。

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

这个想法是,如果用户忘记了他们的密码,他们可以简单地输入他们的电子邮件地址(也作为他们的用户名)并点击按钮: enter image description here
现在,我知道 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; 返回散列密码,有没有办法获取用户以类似方式注册时输入的密码?

最佳答案

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

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

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

关于c# - 向成员(member)发送忘记密码的最佳做法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31698317/

相关文章:

html - 将模型序列化为查询字符串

asp.net - 使用 Asp.net 成员(member)提供程序保护非 .aspx 页面

asp.net - 使用来自 WCF 服务的成员身份提供程序的连接字符串错误

c# - 保存一个巨大文本文件的特定部分(超过 2GB)

c# - 静态的线程安全

C# 泛型运算符

ruby-on-rails - 扩展设备注册 Controller

c# - 获取 IQueryable 中的所有结果而不是 .FirstOrDefault

asp.net - 使用 LDAP 的 Active Directory 成员资格提供程序

c# - 检查 HtmlHelperMethod 中是否存在(部分) View