2013-01-10 30 views
13

我正在構建ASP.NET MVC 4應用程序。我使用簡單成員資格提供程序來管理系統內的身份驗證和授權。在這種方法中更改密碼有哪些方法。我發現了一個ChangePassword方法,它需要三個參數,包括原始密碼才能運行。更改MVC中的密碼4

有沒有其他方法可以在不知道原始密碼的情況下覆蓋/更改用戶的密碼?

+0

難道你不想找密碼重置功能嗎?如果用戶不知道原始密碼,他們是如何登錄的?如果他們沒有登錄,那麼他們的密碼是否會改變? – ProfK

回答

18

當用戶想要更改密碼時使用ChangePassword,並且當前密碼是允許發生這種情況的證據(請考慮更改密碼屏幕)。

我認爲最直接的方法是調用WebSecurity.GeneratePasswordResetToken()並將結果和新密碼一起傳遞給WebSecurity.ResetPassword。

var token = WebSecurity.GeneratePasswordResetToken("UserName"); 
    var result = WebSecurity.ResetPassword(token, "NewPassword"); 
+0

非常感謝!!!! – Bartosz

4

有關於how to implement password reset/change with SimpleMembership in MVC 4 here的詳細文章。它還包括可以下載的源代碼。

本示例使用電子郵件向用戶發送URL以單擊以進行密碼重置。這比僅僅讓用戶直接在網站上輸入舊密碼和新密碼更安全,因爲它是用戶的另一種驗證。這可以緩解某人獲取用戶密碼並通過更改密碼將其鎖定的情況。這也允許用戶在忘記密碼的情況下重置密碼。

通過鏈接發送電子郵件的代碼看起來像這樣。

[AllowAnonymous] 
[HttpPost] 
public ActionResult ResetPassword(ResetPasswordModel model) 
{ 
    string emailAddress = WebSecurity.GetEmail(model.UserName); 
    if (!string.IsNullOrEmpty(emailAddress)) 
    { 
     string confirmationToken = 
      WebSecurity.GeneratePasswordResetToken(model.UserName); 
     dynamic email = new Email("ChngPasswordEmail"); 
     email.To = emailAddress; 
     email.UserName = model.UserName; 
     email.ConfirmationToken = confirmationToken; 
     email.Send(); 

     return RedirectToAction("ResetPwStepTwo"); 
    } 

    return RedirectToAction("InvalidUserName"); 
} 

這將創建一個有一個鏈接到一個Web API接受令牌作爲傳入的ID的電子郵件。當他們點擊鏈接,它擊中這個方法。

[AllowAnonymous] 
public ActionResult ResetPasswordConfirmation(string Id) 
{ 
    ResetPasswordConfirmModel model = new ResetPasswordConfirmModel() { Token = Id }; 
    return View(model); 
} 

這個動作從查詢字符串獲取令牌,並把它傳遞給它允許用戶輸入新的密碼視圖的ResetPasswordConfirmationModel。輸入新密碼兩次以確保它們輸入正確,並在頁面上進行驗證。當他們提交這些信息時,他們被帶到實際重置密碼的POST操作。

[AllowAnonymous] 
[HttpPost] 
public ActionResult ResetPasswordConfirmation(ResetPasswordConfirmModel model) 
{ 
    if (WebSecurity.ResetPassword(model.Token, model.NewPassword)) 
    { 
     return RedirectToAction("PasswordResetSuccess"); 
    } 
    return RedirectToAction("PasswordResetFailure"); 
} 
+0

儘管這個鏈接可能回答這個問題,但最好在這裏包含答案的重要部分,並提供供參考的鏈接。如果鏈接頁面更改,則僅鏈接答案可能會失效。 - [來自評論](/ review/low-quality-posts/10490453) – skrrgwasme

+1

@skrrgwasme - 好點。我已在我更新的答案中添加了相關詳細信息。 –