2015-04-07 174 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