管理者がユーザーのパスワードを変更する機能が必要です。したがって、管理者はユーザーの現在のパスワードを入力するべきではなく、新しいパスワードを設定できる必要があります。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 メソッドでエラーを受け取る可能性があります。そのため、古いパスワードは削除されますが、新しいパスワードは設定されていません。良くない。「1回のトランザクション」でそれを行う方法はありますか? PS。リセット トークンを使用した ResetPasswordAsync メソッドを見ましたが、より安全なようです (ユーザーとの不安定な状況にならないため) が、いずれにしても 2 つのアクションで実行されます。