我需要管理员更改用户密码的能力。所以,管理员不应该输入用户的当前密码,他应该有能力设置一个新的密码。我看一下 ChangePasswordAsync 方法,但是这种方法需要输入旧密码。因此,此方法不适用于此任务。因此,我通过以下方式做到了:
[HttpPost]
public async Task<ActionResult> ChangePassword(ViewModels.Admin.ChangePasswordViewModel model)
{
var userManager = HttpContext.GetOwinContext().GetUserManager<ApplicationUserManager>();
var result = await userManager.RemovePasswordAsync(model.UserId);
if (result.Succeeded)
{
result = await userManager.AddPasswordAsync(model.UserId, model.Password);
if (result.Succeeded)
{
return RedirectToAction("UserList");
}
else
{
ModelState.AddModelError("", result.Errors.FirstOrDefault());
}
}
else
{
ModelState.AddModelError("", result.Errors.FirstOrDefault());
}
return View(model);
}
它可以工作,但理论上我们可以在 AddPasswordAsync 方法上收到错误。因此,旧密码将被删除,但未设置新密码。这样不好。有什么办法可以在“一次交易”中做到这一点?PS。我看到了带有重置令牌的 ResetPasswordAsync 方法,似乎它更安全(因为用户不会出现不稳定的情况),但无论如何,它通过 2 个动作来完成。