当用户更改密码时,我需要立即使其无效并注销任何其他已登录的会话,但允许活动会话(刚刚更新其密码的用户)保持登录状态。
为此,我在UserManager上使用UpdateSecurityStampAsync(currentUser.Id);
方法。所有其他会话都已成功注销,但在更新安全标记后,尽管调用SignInAsync
,活动会话也会被注销。
我使用的身份配置如下:
app.UseCookieAuthentication(new CookieAuthenticationOptions
{
AuthenticationType = DefaultAuthenticationTypes.ApplicationCookie,
LoginPath = new PathString("/Login"),
Provider = new CookieAuthenticationProvider
{
OnValidateIdentity = SecurityStampValidator.OnValidateIdentity<ApplicationUserManager, ApplicationUser>(
validateInterval: TimeSpan.FromMinutes(0),
regenerateIdentity: (manager, user) => user.GenerateUserIdentityAsync(manager))
},
CookieHttpOnly = true,
CookieSecure = CookieSecureOption.SameAsRequest,
SlidingExpiration = false,
ExpireTimeSpan = TimeSpan.FromMinutes(10)
});
正在更新密码,更新安全标记以及据称将当前用户重新登录的控制器代码段是:
var updateResult = await _userManager.ChangePasswordAsync(currentUser.Id, form.CurrentPassword, form.NewPassword);
if (!updateResult.Succeeded)
{
//handle update failure
}
_signInManager.AuthenticationManager.SignOut();
//updating the security stamp invalidates all other sessions
await _userManager.UpdateSecurityStampAsync(currentUser.Id);
await _signInManager.SignInAsync(currentUser, false, false);
运行代码,密码已成功更新,并且由于更新了安全标记,所有会话都将被注销。但根据我见过的其他示例(如此answer from Chris),上面的代码应该刷新auth cookie并保持活动用户登录。
我尝试过以上代码的不同变体:
SignIn
扩展方法代替异步所有变体都会产生相同的结果:用户在更改密码后被迫重新登录。
是否存在配置错误或其他我忽略的内容?
编辑:
我通过将DefaultAuthenticationTypes
添加到SignOut
来电,无意中解决了问题。
相关代码现为:
//updating the security stamp invalidates all other sessions
await _userManager.UpdateSecurityStampAsync(currentUser.Id);
_signInManager.AuthenticationManager.SignOut(DefaultAuthenticationTypes.ApplicationCookie);
await _signInManager.SignInAsync(currentUser, false, false);
但是,如果有人能解释为什么认证类型在这种情况下很重要?
答案 0 :(得分:1)
不要将验证间隔设置为TimeSpan.FromMinutes(0),因为这会导致立即发出登录cookie,而是将其设置为1秒钟。