2013-09-25 244 views
25

Microsoft sắp ra mắt với new Membership system called ASP.NET Identity (cũng là mặc định trong ASP.NET MVC 5). Tôi đã tìm thấy sample project, nhưng điều này không được thực hiện đặt lại mật khẩu.Làm cách nào để thực hiện đặt lại mật khẩu với ASP.NET Identity cho ASP.NET MVC 5.0?

Chủ đề đặt lại mật khẩu chỉ tìm thấy Điều này: Implementing User Confirmation and Password Reset with One ASP.NET Identity – Pain or Pleasure, không giúp ích cho tôi, vì không sử dụng khôi phục mật khẩu được cài sẵn.

Khi tôi đang xem xét các tùy chọn, vì tôi nghĩ chúng tôi cần tạo mã thông báo đặt lại, mà tôi sẽ gửi cho người dùng. Người dùng có thể đặt mật khẩu mới bằng mã thông báo, ghi đè mật khẩu cũ.

Tôi đã tìm thấy IdentityManager.Passwords.GenerateResetPasswordToken/IdentityManager.Passwords.GenerateResetPasswordTokenAsync(string tokenId, string userName, validUntilUtc), nhưng tôi không thể hiểu ý nghĩa của thông số tokenId.

Làm cách nào để triển khai Đặt lại mật khẩu trong ASP.NET với MVC 5.0?

+1

Cảm ơn sự giúp đỡ và hỗ trợ của bạn! Vấn đề của tôi là phương thức (IdentityManager.Passwords.GenerateResetPasswordToken) được mô tả không thể tìm thấy bất kỳ thông tin nào ở bất cứ đâu, vì vậy tôi không thể sử dụng nó. Nhưng dù sao, tôi sẽ sớm bù đắp cho các thông tin còn thiếu và tôi sẽ bao gồm mã hợp lệ! –

+0

vậy sự khác nhau giữa 'IdentityManager' và' UserManager' là gì?Khi tôi tạo một dự án mới, 'AccountController' đã sử dụng' UserManager'. – Eonasdan

+1

Tôi đã chuyển câu trả lời của bạn cho câu trả lời của bạn, thay vì câu hỏi trong câu hỏi. –

Trả lời

6

Tôi nhận được: Mã thông báo là mã nhận dạng được chọn tự do, nhận dạng tùy chọn mật khẩu. Ví dụ,

1. trông giống như quá trình khôi phục mật khẩu, bước 1 (nó được dựa trên: 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 Và sau đó khi người dùng nhập vào các dấu hiệu và mật khẩu mới :

[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 proposal để sample project trên github, nếu có ai cần nó có thể tested.The E-mail gửi chưa được viết, có thể với việc bổ sung sớm.

+0

IdentityManager là gì và nó đến từ đâu?! – stuartdotnet

+0

Tôi cũng muốn biết 'IdentityManager' là gì. Hãy giúp tôi. –

+0

@stuartdotnet Hệ thống ASP.NET Identity được thiết kế để thay thế các thành viên ASP.NET và các hệ thống thành viên đơn giản trước đó. http://www.asp.net/identity –

5

Có vẻ như rất nhiều rắc rối ... lợi thế gì cho trên trên:

  1. người dùng nhấp vào liên kết 'Khôi phục tài khoản'
  2. này sẽ gửi một 64 byte mã hóa chuỗi của một datetime giá trị tick (gọi nó là psuedo-hash) trong email
  3. nhấp vào liên kết ngược lại trong email tới tuyến điều khiển/hành động mà
  4. khớp email và máy chủ nguồn của nó để băm băm, giải mã băm psuedo, xác thực thời gian kể từ khi được gửi và
  5. cung cấp Chế độ xem để người dùng đặt mật khẩu mới
  6. bằng mật khẩu hợp lệ, mã sẽ xóa mật khẩu người dùng cũ và gán mật khẩu mới.
  7. Sau khi hoàn tất, thành công hay không, hãy xóa băm psuedo.

Với luồng này, bạn không bao giờ phải gửi mật khẩu ra khỏi miền của mình.

Xin vui lòng, bất cứ ai, chứng minh cho tôi cách thức này kém an toàn hơn.

+10

Tôi thực sự muốn loại bỏ câu trả lời này, nhưng bỏ nó lại để xem sự điên rồ trong quá trình suy nghĩ của nó. 1. Quá trình đặt lại mật khẩu Asp.Net được chuẩn hóa và chứng minh. 2. Không có mật khẩu nào được gửi qua dây. 3. Tại sao tái tạo bánh xe? 4. Khi bạn hiểu cách khôi phục mật khẩu hoạt động trong Identity 2.1+, nó đơn giản như thế nào, tại sao bạn lại muốn bận tâm với việc phát triển bất kỳ thứ gì khác - bao gồm cả thời gian cần thiết để thiết kế và kiểm tra quá trình của bạn đủ kỹ lưỡng. Đừng làm những gì câu trả lời của tôi gợi ý - nó chỉ là một thời gian thải –