2012-11-03 114 views
3

看來這兩個功能在WebMatrix代碼中有一組幫助功能和架構可以開始。然而,沒有控制器方法或視圖來完成它,所以你必須實現自己。忘記密碼+電子郵件確認ASP.NET MVC WebMatrix

是否有任何樣品可以將這些代碼複製到我的應用程序中?我在尋找的東西:

  • 生成忘記密碼Email
  • 生成確認電子郵件
  • 忘記密碼圖+控制器方法
  • 重發確認郵件視圖+控制器方法

回答

15

FORGOT PASSWORD功能

有一天,我試圖創建一個「忘記密碼功能「在asp.net MVC 4.我谷歌進出,但不能得到最好的解決方案。我終於找到了出路。 15個簡單的步驟

第1部分 發送密碼通過電子郵件重置信息

步驟1 •創建的mvc 4 C#的互聯網應用程序模板:) (帳戶和主控制器將自動生成) •編譯和運行你的項目。註冊並登錄。 (簡單成員表將被生成)

     Everything working fine? 

步驟2 •糟糕!!他們在註冊時不要求我們的電子郵件ID!爲了向用戶發送密碼令牌,我們需要他們的電子郵件ID!所以讓我們對數據庫進行一些更改,然後轉到服務器資源管理器! (如果你找不到它,你可以按Ctrl + Alt + S) •展開「數據連接」,你會看到幾個表格。打開用戶配置文件表。 添加下列:

  1. EMAILID爲nvarchar(最大) 2.Details爲nvarchar(最大)

步驟3 •現在去Solution Explorer中... ...型號Account模型。 ..註冊模型 •用於電子郵件ID和詳細信息

//new properties 
    [Required] 
    [Display(Name="Email ID")] 
    public string EmailId { get; set; } 

    [Required] 
    [Display(Name = "About Yourself")] 
    public string Details { get; set; } 

步驟4 添加這兩個屬性•現在去Solution Explorer中...查看...一個ccount Views ... Register.cshtml查看 •添加這兩個屬性以允許用戶輸入電子郵件ID和其他詳細信息。

  • @ Html.LabelFor(M => m.EmailId) @ Html.TextBoxFor(M => m.EmailId)
  • @ Html.LabelFor(M => m.Details) @ Html.TextBoxFor(M => m.Details)
  • 步驟5 •現在去解決方案管理器... ...控制器賬戶控制器...註冊控制器操作方法的發佈版本 •添加這些屬性以允許用戶輸入電子郵件ID和其他詳細信息。突出顯示更改。

    [HttpPost] 
    [AllowAnonymous] 
    [ValidateAntiForgeryToken] 
    public ActionResult Register(RegisterModel model) 
    { 
        if (ModelState.IsValid) 
        { 
         // Attempt to register the user 
         try 
         { 
          WebSecurity.CreateUserAndAccount(model.UserName, model.Password, new { EmailId = model.EmailId, Details = model.Details}); 
    
          WebSecurity.Login(model.UserName, model.Password); 
          return RedirectToAction("Index", "Home"); 
         } 
         catch (MembershipCreateUserException e) 
         { 
          ModelState.AddModelError("", ErrorCodeToString(e.StatusCode)); 
         } 
        } 
    
        // If we got this far, something failed, redisplay form 
        return View(model); 
    } 
    

    爲什麼我們不能再次建立和運行我們的項目?註冊並填寫詳細信息。現在您還需要指定電子郵件地址。添加這些屬性以允許用戶輸入電子郵件ID和其他詳細信息。

    轉到服務器資源管理器並右鍵單擊用戶配置文件表並選擇「顯示錶數據」可以查看您輸入的驗證細節。

    步驟6 •現在讓我們實現了密碼重置功能轉到帳戶控制,並創建以下控制器的操作方法(GET)

    [AllowAnonymous] 
    public ActionResult ForgotPassword() 
    { 
        return View(); 
    } 
    
    • (POST) 
    
    
    [HttpPost] 
    [AllowAnonymous] 
    [ValidateAntiForgeryToken] 
    public ActionResult ForgotPassword(string UserName) 
    { 
        //check user existance 
        var user = Membership.GetUser(UserName); 
        if (user == null) 
        { 
         TempData["Message"] = "User Not exist."; 
        } 
        else 
        { 
         //generate password token 
         var token = WebSecurity.GeneratePasswordResetToken(UserName); 
         //create url with above token 
         var resetLink = "<a href='" + Url.Action("ResetPassword", "Account", new { un = UserName, rt = token }, "http") + "'>Reset Password</a>"; 
         //get user emailid 
         UsersContext db = new UsersContext(); 
         var emailid = (from i in db.UserProfiles 
             where i.UserName == UserName 
             select i.EmailId).FirstOrDefault(); 
         //send mail 
         string subject = "Password Reset Token"; 
         string body = "<b>Please find the Password Reset Token</b><br/>" + resetLink; //edit it 
         try 
         { 
          SendEMail(emailid, subject, body); 
          TempData["Message"] = "Mail Sent."; 
         } 
         catch (Exception ex) 
         { 
          TempData["Message"] = "Error occured while sending email." + ex.Message; 
         } 
         //only for testing 
         TempData["Message"] = resetLink; 
        } 
    
        return View(); 
    } 
    

    •該GET控制器操作只是返回的視圖。 •POST控制器操作: 接收用戶名 驗證其是否存在 生成密碼重置令牌 生成要通過電子郵件發送的URL。

    步驟7 •在忘記密碼的操作方法右鍵單擊並添加視圖爲視圖頁面的代碼會像下面

    @{ 
        ViewBag.Title = "Forgot Password"; 
    } 
    
    <h2>Forgot Password</h2> 
    
    
    
    @using (Html.BeginForm()) 
    { 
        @Html.AntiForgeryToken() 
        <fieldset> 
         <legend>Forgot Password Form</legend> 
         <ol> 
          <li> 
           @Html.Label("User Name", new { @for = "UserName" }) 
           @Html.TextBox("UserName") 
           <span style="color:red;">@TempData["Message"]</span> 
          </li> 
         </ol> 
         <input type="submit" value="Recover" /> 
        </fieldset> 
    } 
    

    •視圖頁面將顯示一個文本框,其中用戶可以輸入用戶名。

    步驟8 •現在轉到解決方案資源管理器...模型...帳戶模型...用戶配置文件視圖模型。變化已經凸顯

    [Table("UserProfile")] 
    public class UserProfile 
    { 
        [Key] 
        [DatabaseGeneratedAttribute(DatabaseGeneratedOption.Identity)] 
        public int UserId { get; set; } 
        public string UserName { get; set; } 
        //new properties 
        public string EmailId { get; set; } 
        public string Details { get; set; } 
    } 
    

    步驟9 •現在去Solution Explorer中...查看...帳戶...登錄查看。 現在我們可以看到一個選項,以便在他忘記密碼的情況下恢復他的密碼。

    <ul>  
          <li> 
            @Html.ActionLink("Register", "Register") if you don't have an account. 
          </li> 
          <li> 
            @Html.ActionLink("Forgot Password", "ForgotPassword") if you want to recover your password. 
          </li> 
         </ul> 
    

    第2部分 接收密碼的網址重置信息

    步驟1 •轉到解決方案資源管理器... ...賬戶控制器... 創建新重置密碼操作方法 •這個方法接受URL中的'un'(即用戶名)和'rt'(即密碼重置令牌)。

    [AllowAnonymous] 
    public ActionResult ResetPassword(string un, string rt) 
    { 
        UsersContext db = new UsersContext(); 
        //TODO: Check the un and rt matching and then perform following 
        //get userid of received username 
        var userid = (from i in db.UserProfiles 
            where i.UserName == un 
            select i.UserId).FirstOrDefault(); 
        //check userid and token matches 
        bool any = (from j in db.webpages_Memberships 
           where (j.UserId == userid) 
           && (j.PasswordVerificationToken == rt) 
           //&& (j.PasswordVerificationTokenExpirationDate < DateTime.Now) 
           select j).Any(); 
    
        if (any == true) 
        { 
         //generate random password 
         string newpassword = GenerateRandomPassword(6); 
         //reset password 
         bool response = WebSecurity.ResetPassword(rt, newpassword); 
         if (response == true) 
         { 
          //get user emailid to send password 
          var emailid = (from i in db.UserProfiles 
              where i.UserName == un 
              select i.EmailId).FirstOrDefault(); 
          //send email 
          string subject = "New Password"; 
          string body = "<b>Please find the New Password</b><br/>" + newpassword; //edit it 
          try 
          { 
           SendEMail(emailid, subject, body); 
           TempData["Message"] = "Mail Sent."; 
          } 
          catch (Exception ex) 
          { 
           TempData["Message"] = "Error occured while sending email." + ex.Message; 
          } 
    
          //display message 
          TempData["Message"] = "Success! Check email we sent. Your New Password Is " + newpassword; 
         } 
         else 
         { 
          TempData["Message"] = "Hey, avoid random request on this page."; 
         } 
        } 
        else 
        { 
         TempData["Message"] = "Username and token not maching."; 
        }   
    
        return View(); 
    } 
    

    步驟2 •在重置密碼的操作方法右鍵單擊並添加視圖爲視圖頁面的代碼將是如下

    @{ 
        ViewBag.Title = "ResetPassword"; 
    } 
    
    <h2>Password Mailed :) </h2> 
    

    步驟3 •轉到解決方案資源管理.. .Models ...帳戶模型... 進行以下更改。 •我們創建一個UserProfile數據庫模型的實例,並將DbSet.Use'webpages_Memberships'作爲模型實現db.webpages_Memberships'。

    public class UsersContext : DbContext 
        { 
         public UsersContext() 
          : base("DefaultConnection") 
         { 
         } 
    
         public DbSet<UserProfile> UserProfiles { get; set; } 
         public DbSet<webpages_Membership> webpages_Memberships { get; set; } 
        } 
    
        [Table("webpages_Membership")] 
        public class webpages_Membership 
        { 
         [Key] 
         public int UserId { get; set; } 
         public DateTime CreateDate { get; set; } 
         public string ConfirmationToken { get; set; } 
         public bool IsConfirmed { get; set; } 
         public DateTime LastPasswordFailureDate { get; set; } 
         public int PasswordFailuresSinceLastSuccess { get; set; } 
         public string Password { get; set; } 
         public DateTime PasswordChangeDate { get; set; } 
         public string PasswordSalt { get; set; } 
         public string PasswordVerificationToken { get; set; } 
         public DateTime PasswordVerificationTokenExpirationDate { get; set; } 
        } 
    

    步驟4 •隨機密碼生成功能添加到賬戶控制器 •稱爲將爲用戶生成一個隨機密碼時,此方法

    private string GenerateRandomPassword(int length) 
        { 
         string allowedChars = "[email protected]$?_-*&#+"; 
         char[] chars = new char[length]; 
         Random rd = new Random(); 
         for (int i = 0; i < length; i++) 
         { 
          chars[i] = allowedChars[rd.Next(0, allowedChars.Length)]; 
         } 
         return new string(chars); 
        } 
    

    步驟5 •添加了發送電子郵件帳戶控制器中的功能。 •此功能會在用戶點擊忘記密碼錶單上的恢復按鈕時向用戶發送第一封郵件。第一封郵件包含重置密碼鏈接。當用戶點擊鏈接時。用戶將被重定向到重置密碼頁面。新的密碼將再次郵寄給用戶。 •您需要輸入您的電子郵件地址來代替[email protected]並寫下您的密碼。

    private void SendEMail(string emailid, string subject, string body) 
         { 
          System.Net.Mail.SmtpClient client = new System.Net.Mail.SmtpClient(); 
          client.DeliveryMethod = System.Net.Mail.SmtpDeliveryMethod.Network; 
          client.EnableSsl = true; 
          client.Host = "smtp.gmail.com"; 
          client.Port = 587; 
    
    
          System.Net.NetworkCredential credentials = new System.Net.NetworkCredential("[email protected]", "password"); 
          client.UseDefaultCredentials = false; 
          client.Credentials = credentials; 
    
          System.Net.Mail.MailMessage msg = new System.Net.Mail.MailMessage(); 
          msg.From = new MailAddress("[email protected]"); 
          msg.To.Add(new MailAddress(emailid)); 
    
          msg.Subject = subject; 
          msg.IsBodyHtml = true; 
          msg.Body = body; 
    
          client.Send(msg); 
         } 
    
    +2

    +1您的答案的剪切長度。 –