2015-04-07 104 views
2

我需要創建方法,如果我不知道舊密碼,它可以更改數據庫中的密碼。例如,我有下面的代碼:如何更改密碼,如果我不知道舊密碼?

 public IHttpActionResult ChangePassword(ChangePasswordBindingModel model) 
    { 
     if (!ModelState.IsValid) 
     { 
      return BadRequest(ModelState); 
     } 

     var result = UserManager.ChangePassword(User.Identity.GetUserId(), model.OldPassword, 
      model.NewPassword); 
     if (!result.Succeeded) 
     { 
      return GetErrorResult(result); 
     } 

     return Ok(); 
    } 

在此代碼需要「model.OldPassword」,但用戶不知道舊密碼。 我只有密碼和當前用戶ID。

+0

我可以在我的例子中使用「PasswordHasher.HashPassword」嗎? – Yura

+2

所以你想要一個不知道密碼的人能夠把它改成一個他們可以使用的新密碼,對嗎?你看不出有什麼問題嗎?無論如何,這樣做應該是一個管理員功能 - 知道管理員密碼的人可以更改其他用戶的密碼。 –

+1

@MthetheWWatson我明白你要去哪裏,但是如果OP會用郵件驗證或類似的方法來做呢? – maam27

回答

6

嗯,我不知道這是否是最佳的,但它很容易。

第一:

var code = await UserManager.GeneratePasswordResetTokenAsync(userId); 

然後

var result = await UserManager.ResetPasswordAsync(userId, code, someNewPassword); 

你甚至可以把它包起來的擴展方法

public static class UserManagerEx 
{ 
    public static async Task<IdentityResult> ForceChangePassword<T, TUserId>(
     this UserManager<T, TUserId> userManager, 
     TUserId userId, 
     string newPassword) 
      where T : class, IUser<TUserId> 
      where TUserId : IEquatable<TUserId> 
    { 
     var code = await userManager.GeneratePasswordResetTokenAsync(userId); 
     var result = await userManager.ResetPasswordAsync(userId, code, newPassword); 
     return result; 
    } 
} 

然後調用它:

var result = UserManager.ForceChangePassword(userId, newPassword); 
+0

謝謝,你的回答幫了我。 – Yura