Visual Studio 2017 中的默认项目模板在 ManageController 中包含一个函数,供登录用户更改其密码。
成功更改密码后,用户将再次自动登录
await _signInManager.SignInAsync(user, isPersistent: false);
登录的目的是什么?
完整的 Action 方法如下:
[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));
}
最佳答案
内部 ChangePasswordAsync
, 有一个调用 UpdatePasswordHash
,它本身会调用 UpdateSecurityStampInternal
。 UpdateSecurityStampInternal
的实现并不重要 - 重要的是这(显然)更新了用户的 SecurityStamp
属性。
查看 SignInManager
的工作原理,您会看到 SignInAsync
以调用 UserClaimsPrincipalFactory
的 CreateAsync
结束方法,它本身调用 GenerateClaimsAsync
.在此实现中,您将看到以下内容:
if (UserManager.SupportsUserSecurityStamp)
{
id.AddClaim(new Claim(Options.ClaimsIdentity.SecurityStampClaimType,
await UserManager.GetSecurityStampAsync(user)));
}
这意味着在更改密码后,现有的 SecurityStampClaimType
值将发生变化。重新发出登录操作可确保创建新的 ClaimsIdentity
,其中包括 SecurityStamp
的新值。
这可能不是此登录操作的唯一原因,但它确实是一个原因。
关于c# - 为什么在 ASP.Net Core 2 MVC 中更改密码后登录,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48445497/