ASP .NET身份2-密码更新后还记录了当前会话后,还记录其他会话(使用安全邮票)



当用户更改密码时,我需要立即无效并注销任何其他登录的会话,但允许Active会话(刚刚更新其密码(保持登录。<<<<<<<<<<<</p>

为此,我正在使用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)
});

正在更新密码,更新安全邮票并将当前用户记录回IS的控制器代码片段:

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

运行代码,由于更新的安全印章而成功更新了密码,并且所有会话均已记录。但是根据我看到的其他示例(例如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);

但是,如果有人可以解释为什么身份验证类型在这种情况下很重要?

不将验证间隔设置为timespan.fromminutes(0(,因为这会立即发出cookie中的符号,而是将其设置为1秒钟之类的东西。

相关内容

  • 没有找到相关文章

最新更新