1

首先我很新的MVC和我試圖實現對MVC 4.我該使用這種技術張貼在這裏實施的密碼恢復功能:Where to find C# sample code to implement password recovery in ASP .NET MVC2MVC 4密碼恢復

我理解它的工作方式然而缺少一個我現在嘗試實施的幫助類。我正在談論的類:NotificationsHelper.SendPasswordRetrieval(model.Email,this.ControllerContext);

控制器上的RetrievePassword acction控制器具有參數PasswordRetrievalModel模型。我想這是一個類模型,連接到數據庫和實現主題之間的一些屬性是一個字符串屬性,稱爲電子郵件。它是否正確?

比,NotificationsHelper.SendPasswordRetrieval(model.Email,this.ControllerContext);靜態類實現此靜態方法SendPasswordRetrievla 2個paramateres:model.Email是字符串屬性frrom的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("[email protected]"); 
      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?如果是,我怎麼從那裏得到它?

回答

0

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("[email protected]"); 
      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; 
     } 
    } 

一旦用戶重置密碼,清空重置令牌場