Visual Studio 2017中的默认项目模板在ManageController中包含一个用于登录用户更改其密码的功能。
成功更改密码后,用户将再次自动登录
await _signInManager.SignInAsync(user, isPersistent: false);
此登录的目的是什么?
完整的操作方法如下:
[HttpPost]
[ValidateAntiForgeryToken]
public async Task<IActionResult> ChangePassword(ChangePasswordViewModel model)
{
if (!ModelState.IsValid)
{
return View(model);
}
var user = await _userManager.GetUserAsync(User);
if (user == null)
{
throw new ApplicationException($"Unable to load user with ID '{_userManager.GetUserId(User)}'.");
}
var changePasswordResult = await _userManager.ChangePasswordAsync(user, model.OldPassword, model.NewPassword);
if (!changePasswordResult.Succeeded)
{
AddErrors(changePasswordResult);
return View(model);
}
await _signInManager.SignInAsync(user, isPersistent: false);
_logger.LogInformation("User changed their password successfully.");
StatusMessage = "Your password has been changed.";
return RedirectToAction(nameof(ChangePassword));
}
答案 0 :(得分:2)
在ChangePasswordAsync
内,有一个UpdatePasswordHash
的来电,它本身会调用UpdateSecurityStampInternal
。 UpdateSecurityStampInternal
的实现并不重要 - 重要的是,这显然会更新用户的SecurityStamp
属性。
查看SignInManager
的工作原理,您会发现SignInAsync
最终会调用UserClaimsPrincipalFactory
的{{3}}方法,调用CreateAsync
。在此实现中,您将看到以下内容:
if (UserManager.SupportsUserSecurityStamp)
{
id.AddClaim(new Claim(Options.ClaimsIdentity.SecurityStampClaimType,
await UserManager.GetSecurityStampAsync(user)));
}
这意味着更改密码后,现有的SecurityStampClaimType
值将会更改。重新签名登录操作可确保创建新的ClaimsIdentity
,其中包含SecurityStamp
的新值。
这可能不是此次登录操作的唯一原因,但它似乎确实是 的原因。