2013-09-25 19 views
25

微軟將提供一個new Membership system called ASP.NET Identity(也是ASP.NET MVC 5中的默認設置)。我發現sample project,但是這沒有執行密碼重置。如何使用ASP.NET標識爲ASP.NET MVC 5.0實現密碼重置?

在密碼重置的話題剛剛找到這篇文章:Implementing User Confirmation and Password Reset with One ASP.NET Identity – Pain or Pleasure,不由對我來說,因爲不使用內置的密碼恢復。

當我正在尋找的選項,我認爲我們需要產生復位標記,我將發送給用戶。用戶可以使用令牌設置新密碼,覆蓋舊密碼。

我找到IdentityManager.Passwords.GenerateResetPasswordToken/IdentityManager.Passwords.GenerateResetPasswordTokenAsync(string tokenId, string userName, validUntilUtc),但我無法弄清楚它可能意味着tokenId參數。

如何在ASP.NET中實現的密碼重設與MVC 5.0?

+1

感謝您的幫助和支持!我的問題是,描述的方法(IdentityManager.Passwords.GenerateResetPasswordToken)無法在任何地方找到任何信息,所以我無法使用它。但無論如何,我很快會彌補缺失的信息,並且我將包含有效的代碼! –

+0

所以'IdentityManager'和'UserManager'有什麼區別?當我創建一個新項目時,'AccountController'使用'UserManager'。 – Eonasdan

+1

我已將答案移至答案上,而不是問題中。 –

回答

6

我明白了:該tokenid是一個自由選擇的身份識別密碼的選項。例如,

1.看起來像密碼恢復過程,步驟1 (它是基於:https://stackoverflow.com/a/698879/208922

[HttpPost] 
[ValidateAntiForgeryToken] 
[AllowAnonymous] 
//[RecaptchaControlMvc.CaptchaValidator] 
public virtual async Task<ActionResult> ResetPassword(
               ResetPasswordViewModel rpvm) 
{ 
    string message = null; 
    //the token is valid for one day 
    var until = DateTime.Now.AddDays(1); 
    //We find the user, as the token can not generate the e-mail address, 
    //but the name should be. 
    var db = new Context(); 
    var user = db.Users.SingleOrDefault(x=>x.Email == rpvm.Email); 

    var token = new StringBuilder(); 

    //Prepare a 10-character random text 
    using (RNGCryptoServiceProvider 
         rngCsp = new RNGCryptoServiceProvider()) 
    { 
     var data = new byte[4]; 
     for (int i = 0; i < 10; i++) 
     { 
      //filled with an array of random numbers 
      rngCsp.GetBytes(data); 
      //this is converted into a character from A to Z 
      var randomchar = Convert.ToChar(
             //produce a random number 
             //between 0 and 25 
             BitConverter.ToUInt32(data, 0) % 26 
             //Convert.ToInt32('A')==65 
             + 65 
          ); 
      token.Append(randomchar); 
     } 
    } 
    //This will be the password change identifier 
    //that the user will be sent out 
    var tokenid = token.ToString(); 

    if (null!=user) 
    { 
     //Generating a token 
     var result = await IdentityManager 
           .Passwords 
           .GenerateResetPasswordTokenAsync(
               tokenid, 
               user.UserName, 
               until 
          ); 

     if (result.Success) 
     { 
      //send the email 
      ... 
     } 
    } 
    message = 
     "We have sent a password reset request if the email is verified."; 
    return RedirectToAction(
        MVC.Account.ResetPasswordWithToken(
           token: string.Empty, 
           message: message 
        ) 
      ); 
} 

2,然後當用戶進入該令牌和新密碼:

[HttpPost] 
[ValidateAntiForgeryToken] 
[AllowAnonymous] 
//[RecaptchaControlMvc.CaptchaValidator] 
public virtual async Task<ActionResult> ResetPasswordWithToken(
              ResetPasswordWithTokenViewModel 
                 rpwtvm 
             ) 
{ 
    if (ModelState.IsValid) 
    { 
     string message = null; 
     //reset the password 
     var result = await IdentityManager.Passwords.ResetPasswordAsync(
                rpwtvm.Token, 
                rpwtvm.Password 
          ); 
     if (result.Success) 
     { 
      message = "the password has been reset."; 
      return RedirectToAction(
         MVC.Account.ResetPasswordCompleted(message: message) 
        ); 
     } 
     else 
     { 
      AddErrors(result); 
     } 
    } 
    return View(MVC.Account.ResetPasswordWithToken(rpwtvm)); 
} 

Skeleton proposalsample project GitHub上,如果有人需要它可能是tested.The電子郵件發送尚未寫入,可能與添加很快。

+0

什麼是IdentityManager,它來自哪裏? – stuartdotnet

+0

我也想知道什麼是'IdentityManager'。請幫忙。 –

+0

@stuartdotnet ASP.NET標識系統旨在取代以前的ASP.NET Membership和Simple Membership系統。 http://www.asp.net/identity –

5

好像很多麻煩...... 什麼優勢並以上給出了:

  1. 用戶點擊「恢復帳戶鏈接
  2. 這發出了一個日期時間的64字節編碼字符串蜱值(稱之爲僞散列)在一封電子郵件中
  3. 點擊鏈接回到電子郵件到控制器/動作路由
  4. 匹配的電子郵件和它的源服務器僞哈希,解密僞哈希值,只會驗證自發送的時間和
  5. 提供爲用戶設置新密碼
  6. 與有效的密碼查看,代碼刪除舊的用戶密碼並指定新。
  7. 一旦完成,成功與否,請刪除僞哈希。

有了這個流程,你永遠不會向你的域發送密碼。

請,任何人,證明我這是怎麼的任何安全性較低。

+10

我其實想刪除這個答案,但留下來看看它的思想過程中的愚蠢。 1. Asp.Net密碼重置過程已經過標準化和驗證。 2.沒有通過電線發送的密碼。 3.爲什麼要重新發明輪子? 4.一旦你瞭解了密碼恢復在Identity 2.1+中的工作原理,那麼這很簡單,爲什麼你還想開發其他任何東西 - 包括足夠徹底地設計和測試你的過程以通過安全召集所需的時間。不要做我的答案建議 - 這只是一個浪費時間 –