c# - 为什么在 ASP.Net Core 2 MVC 中更改密码后登录

标签 c# asp.net asp.net-mvc authentication asp.net-core

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 ,它本身会调用 UpdateSecurityStampInternalUpdateSecurityStampInternal 的实现并不重要 - 重要的是这(显然)更新了用户的 SecurityStamp 属性。

查看 SignInManager 的工作原理,您会看到 SignInAsync以调用 UserClaimsPrincipalFactoryCreateAsync 结束方法,它本身调用 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/

相关文章:

c# - 获取没有查询字符串的url

c# - 从 MembershipUserCollection 获取单个 MembershipUser

asp.net-mvc - 为什么我的页面仍未被 gzip 压缩?

c# - 我想要一个单例的设计替代方案

c# - 安装 Open XML 2.0

c# - 在没有完整回发的情况下获取查询字符串值

c# - 如何将十六进制#FFFFFF 转换为 System.Drawing.Color

ASP.NET 错误 :The state information is invalid for this page and might be corrupted

c# - 在一个 Controller 中使用 GUID 作为参数?

asp.net - 尽管 session 丢失,Owin 仍然对用户进行身份验证