我需要能够由管理员更改用户密码。因此,管理员不应输入用户的当前密码,他应该能够设置新密码。我查看了 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 个操作来完成。
编辑:我知道OP请求一个在一个事务中执行任务的答案,但我认为代码对人们有用。
所有答案都直接使用PasswordHasher,这不是一个好主意,因为您将失去一些内置功能(验证等)。
另一种方法(我假设是推荐的方法)是创建密码重置令牌,然后使用它来更改密码。例子:
var user = await UserManager.FindByIdAsync(id);
var token = await UserManager.GeneratePasswordResetTokenAsync(user);
var result = await UserManager.ResetPasswordAsync(user, token, "MyN3wP@ssw0rd");
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)