【发布时间】:2015-05-31 05:32:54
【问题描述】:
我需要管理员更改用户密码的能力。所以,管理员不应该输入用户的当前密码,他应该有能力设置新密码。我看一下 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 个动作来完成。
【问题讨论】:
-
这个问题的症结在于一次交易。你会满足于在两次交易中完成并继续尝试直到第二次成功吗?如果没有,您可能必须编写自己的更改密码的实现。
标签: c# asp.net-mvc-5 asp.net-identity-2 reset-password