首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >MVC 4密码恢复

MVC 4密码恢复
EN

Stack Overflow用户
提问于 2012-12-06 15:24:46
回答 1查看 3.7K关注 0票数 1

首先,我对MVC非常陌生,我正在尝试为MVC 4实现密码恢复功能。

我理解它的工作方式,但是缺少一个我现在试图实现的助手类。我指的是这门课:NotificationsHelper.SendPasswordRetrieval(model.Email,this.ControllerContext);

控制器上的RetrievePassword访问控制器具有参数PasswordRetrievalModel model。我猜这是一个连接到db并在主题中实现一些属性的类模型,它是一个名为Email的字符串属性。这是正确的吗?

NotificationsHelper.SendPasswordRetrieval(model.Email,);静态类使用两个参数实现这个静态方法SendPasswordRetrievlamodel.Email,即string属性frrom模型类,因此这将是我们将发送电子邮件的用户电子邮件。第二个参数是this.ControllerContext.。这个参数的意义是什么?发送给SendPasswordRetrieval方法的值将包含哪些值?

而不是像这样实现这个类:

代码语言:javascript
复制
public static class NotificationsHelper
{
    public static bool SendPasswordRetrieval(string emailAddress, ControllerContext ctx)
    {
        try
        {
            StringBuilder emailMessage = new StringBuilder();

            emailMessage.Append("<br />");
            emailMessage.Append("Hello,");
            emailMessage.Append("You have requested a password recovery.");
            emailMessage.Append("<br />");
            emailMessage.Append("Please click the link below to change your password: <br />");
            emailMessage.Append("<br />");
            emailMessage.Append(string.Format("http://www.example.com/Account/Validate?email={0}&token={1}", emailAddress, "**345982374532453435345**"));
            emailMessage.Append("<br />");

            MailMessage email = new MailMessage();
            email.From = new MailAddress("noreplay@example.com");
            email.To.Add(new MailAddress(emailAddress));
            email.Subject = "domain.com Password Recovery";
            email.Body = emailMessage.ToString();
            email.IsBodyHtml = true;

            SmtpClient smtpServer = new SmtpClient();
            smtpServer.Host = "smtp.gmail.com";
            smtpServer.Port = 587;
            smtpServer.Credentials = new NetworkCredential("username", "password");
            smtpServer.EnableSsl = true;
            smtpServer.Send(email);
            return true;
        }            
        catch (Exception e)
        {
            Trace.WriteLine(String.Format("Failure to send email to {0}.", emailAddress));
            return false;
        }
    }
}

在上面的代码中,我列出了对url进行格式化的行,如何使用代码@agarcian提供的代码将令牌带到那里?是来自第二个参数ControllerContext?的令牌。如果是的话,从那里怎么弄?

EN

回答 1

Stack Overflow用户

发布于 2013-01-08 21:37:37

usertable名称为pwdresetTocket添加新列,当用户请求重置密码时,在该用户的pwdresetTocket字段中插入Guid.NewGuid()时,在回调URL中添加相同的内容

如果不想向现有表添加列,则可以创建新表并将其映射到用户表。

那么你的方法就像这样。

代码语言:javascript
复制
public static bool SendPasswordRetrieval(string emailAddress, ControllerContext ctx)
    {
        try
        {
            StringBuilder emailMessage = new StringBuilder();
          string token = Guid.NewGuid();
        // call to a method that will update the table with token
        updateUsertablewithResetTocket(tocken);

            emailMessage.Append("<br />");
            emailMessage.Append("Hello,");
            emailMessage.Append("You have requested a password recovery.");
            emailMessage.Append("<br />");
            emailMessage.Append("Please click the link below to change your password: <br />");
            emailMessage.Append("<br />");
            emailMessage.Append(string.Format("http://www.example.com/Account/Validate?email={0}&token={1}", emailAddress, token));
            emailMessage.Append("<br />");

            MailMessage email = new MailMessage();
            email.From = new MailAddress("noreplay@example.com");
            email.To.Add(new MailAddress(emailAddress));
            email.Subject = "domain.com Password Recovery";
            email.Body = emailMessage.ToString();
            email.IsBodyHtml = true;

            SmtpClient smtpServer = new SmtpClient();
            smtpServer.Host = "smtp.gmail.com";
            smtpServer.Port = 587;
            smtpServer.Credentials = new NetworkCredential("username", "password");
            smtpServer.EnableSsl = true;
            smtpServer.Send(email);
            return true;
        }            
        catch (Exception e)
        {
            Trace.WriteLine(String.Format("Failure to send email to {0}.", emailAddress));
            return false;
        }
    }

用户重置密码后,清空重置令牌字段。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/13746856

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档