为什么在ASP.Net Core 2 MVC中登录以下更改密码?

时间:2018-01-25 14:41:49

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

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));
    }

1 个答案:

答案 0 :(得分:2)

ChangePasswordAsync内,有一个UpdatePasswordHash的来电,它本身会调用UpdateSecurityStampInternalUpdateSecurityStampInternal的实现并不重要 - 重要的是,这显然会更新用户的SecurityStamp属性。

查看SignInManager的工作原理,您会发现SignInAsync最终会调用UserClaimsPrincipalFactory的{​​{3}}方法,调用CreateAsync。在此实现中,您将看到以下内容:

if (UserManager.SupportsUserSecurityStamp)
{
    id.AddClaim(new Claim(Options.ClaimsIdentity.SecurityStampClaimType,
        await UserManager.GetSecurityStampAsync(user)));
}

这意味着更改密码后,现有的SecurityStampClaimType值将会更改。重新签名登录操作可确保创建新的ClaimsIdentity,其中包含SecurityStamp值。

这可能不是此次登录操作的唯一原因,但它似乎确实是 的原因。