Asp.net mvc MVC4密码恢复

Asp.net mvc MVC4密码恢复,asp.net-mvc,controller,asp.net-mvc-4,asp.net-membership,asp.net-mail,Asp.net Mvc,Controller,Asp.net Mvc 4,Asp.net Membership,Asp.net Mail,首先,我是MVC新手,我正在尝试为MVC4实现密码恢复功能。我使用以下技术实现此功能: 我理解它的工作方式,但是缺少了一个我现在尝试实现的helper类。我说的是类:NotificationsHelper.SendPasswordRetrieval(model.Email,this.ControllerContext) 控制器上的RetrievePassword帐户控制器具有参数PasswordRetrievalModel。我猜这是一个连接到db的类模型,实现了主题中的一些属性,是一个名为Ema

首先,我是MVC新手,我正在尝试为MVC4实现密码恢复功能。我使用以下技术实现此功能:

我理解它的工作方式,但是缺少了一个我现在尝试实现的helper类。我说的是类:NotificationsHelper.SendPasswordRetrieval(model.Email,this.ControllerContext)

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

然后,通知shelper.SendPasswordRetrieval(model.Email,this.ControllerContext)
静态类使用两个参数实现此静态方法SendPasswordRetrievla:model.Email这是PasswordRetrievalModel类的字符串属性,因此这将是我们将向其发送电子邮件的用户电子邮件。然后,第二个参数是this.ControllerContext。此参数的意义是什么发送到SendPasswordRetrieval方法的值将包含哪些内容

然后我实现了这样的类:

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;
        }
    }
}
公共静态类通知Shelper
{
公共静态bool SendPasswordRetrieval(字符串emailAddress,ControllerContext ctx)
{
尝试
{
StringBuilder emailMessage=新建StringBuilder();
emailMessage.Append(“
”); emailMessage.Append(“你好,”); emailMessage.Append(“您已请求密码恢复。”); emailMessage.Append(“
”); emailMessage.Append(“请单击下面的链接更改密码:
”); emailMessage.Append(“
”); emailMessage.Append(string.Format(“http://www.example.com/Account/Validate?email={0}&令牌={1},电子邮件地址,**345982374532453435345**); emailMessage.Append(“
”); MailMessage email=新的MailMessage(); email.From=新邮件地址(“noreplay@example.com"); email.To.Add(新邮件地址(emailAddress)); email.Subject=“domain.com密码恢复”; email.Body=emailMessage.ToString(); email.IsBodyHtml=true; SmtpClient smtpServer=新的SmtpClient(); smtpServer.Host=“smtp.gmail.com”; smtpServer.Port=587; smtpServer.Credentials=新的网络凭据(“用户名”、“密码”); smtpServer.EnableSsl=true; 发送(电子邮件); 返回true; } 捕获(例外e) { Trace.WriteLine(String.Format(“未能将电子邮件发送到{0}.”,emailAddress)); 返回false; } } }

在上面的代码中,我列出了url的格式行,如何使用@agacian提供的代码将令牌带到那里?令牌是否来自第二个参数ControllerContext?如果是,如何从那里获取它?

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

若不想将列添加到现有表中,可以创建一个新表并将其映射到用户表

那么你的方法是这样的

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;
        }
    }
publicstaticboolsendpasswordretrieval(字符串emailAddress,ControllerContext ctx)
{
尝试
{
StringBuilder emailMessage=新建StringBuilder();
字符串标记=Guid.NewGuid();
//调用将使用令牌更新表的方法
使用ResetTocket(tocken)更新SerTable;
emailMessage.Append(“
”); emailMessage.Append(“你好,”); emailMessage.Append(“您已请求密码恢复。”); emailMessage.Append(“
”); emailMessage.Append(“请单击下面的链接更改密码:
”); emailMessage.Append(“
”); emailMessage.Append(string.Format(“http://www.example.com/Account/Validate?email={0}&token={1}(emailAddress,token)); emailMessage.Append(“
”); MailMessage email=新的MailMessage(); email.From=新邮件地址(“noreplay@example.com"); email.To.Add(新邮件地址(emailAddress)); email.Subject=“domain.com密码恢复”; email.Body=emailMessage.ToString(); email.IsBodyHtml=true; SmtpClient smtpServer=新的SmtpClient(); smtpServer.Host=“smtp.gmail.com”; smtpServer.Port=587; smtpServer.Credentials=新的网络凭据(“用户名”、“密码”); smtpServer.EnableSsl=true; 发送(电子邮件); 返回true; } 捕获(例外e) { Trace.WriteLine(String.Format(“未能将电子邮件发送到{0}.”,emailAddress)); 返回false; } }
用户重置密码后,清空重置令牌字段