我需要管理员能够修改用户的密码。因此,管理员不应该输入用户的当前密码,而是应该有能力设置一个新密码。我查看了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方法上收到错误。因此,旧密码将被删除但新密码未设置。这不好。有没有办法在“一个事务”中完成它? 附注:我看到了带有重置令牌的ResetPasswordAsync方法,似乎更安全(因为用户不会出现不稳定情况),但无论如何,它都需要2个操作。