当密码更改时,从所有浏览器注销用户

ana*_*and 15 asp.net authentication cookies asp.net-mvc iis-8.5

我有一个重置密码页面: 在此输入图像描述

当用户填写详细信息并单击Reset Password按钮时.调用以下控制器:

public ActionResult ResetPassword(ResetPassword model)
{
    ...
    return RedirectToAction("Logout");
}
Run Code Online (Sandbox Code Playgroud)

当用户更改密码时,他们会Logged Out从浏览器中获取密码.但是,如果他们同时登录到另一个浏览器,他们仍然在另一个浏览器上登录.

我想在用户更改密码时从登录的所有浏览器中注销用户.

Chr*_*ris 15

我看到你正在使用ASP.NET身份2.你正在尝试做的事情已经内置.你需要做的就是更改SecurityStamp,所有以前的身份验证cookie都不再有效.

更改密码后,还需要更改SecurityStamp:

await UserManager.ChangePasswordAsync(User.Identity.GetUserId(), model.OldPassword, model.NewPassword);
await UserManager.UpdateSecurityStampAsync(User.Identity.GetUserId());
Run Code Online (Sandbox Code Playgroud)

如果您希望用户保持登录状态,则必须重新颁发新的身份验证cookie(登录):

    await SignInManager.SignInAsync(user, isPersistent: false, rememberBrowser: false);
Run Code Online (Sandbox Code Playgroud)

否则,还将注销启动密码更改的用户/会话.

要立即注销所有其他会话,您需要降低配置中的检查间隔:

app.UseCookieAuthentication(new CookieAuthenticationOptions
{
    AuthenticationType = DefaultAuthenticationTypes.ApplicationCookie,
    LoginPath = new PathString("/Account/Login"),
    Provider = new CookieAuthenticationProvider
    {
        // Enables the application to validate the security stamp when the user logs in.
        // This is a security feature which is used when you change a password or add an external login to your account.  
        OnValidateIdentity = SecurityStampValidator.OnValidateIdentity<ApplicationUserManager, ApplicationUser>(
            validateInterval: TimeSpan.FromSeconds(1),
            regenerateIdentity: (manager, user) => user.GenerateUserIdentityAsync(manager))
    }
});
Run Code Online (Sandbox Code Playgroud)

重现步骤:

  1. 在VS2015中创建了一个新的Asp.Net Web App.
  2. 选择MVC模板.
  3. 编辑App_Stat/Startup.Auth.cs,第34行:更改validateInterval: TimeSpan.FromMinutes(30)validateInterval: TimeSpan.FromSeconds(1)
  4. 编辑Controllers/ManageController.cs,第236行:添加UserManager.UpdateSecurityStampAsync方法调用.
  5. 运行项目,创建用户,登录,打开不同的浏览器并登录.
  6. 更改密码,在其他浏览器中刷新页面:您应该注销.


Jul*_*lla 6

所以我回到家,决定整理一些代码。给我看看代码!

我将使用处理程序,因此验证总是在用户首次访问应用程序时完成,并且每次操作方法访问都在一个地方完成。

这个想法是,当用户重设密码时,应用程序会记录该用户已重设密码,并且首次未登录并注销该用户。

user.HasResetPassword = true;
user.IsFirstLoginAfterPasswordReset = false;
Run Code Online (Sandbox Code Playgroud)

当用户登录时,应用程序将验证用户先前是否重置了密码,并且现在是第一次登录。如果这些语句有效,则应用程序将更新其记录,以表示您尚未重置密码,并且您不是第一次登录。

步骤1

向ApplicationUser模型添加两个属性

在此处输入图片说明

第2步

使用以下实现在Models文件夹中添加一个AuthHandler.cs类。在此阶段,您将验证用户是否已重设密码,并且自重设密码以来首次未登录。如果是这样,请将用户重定向到登录名。

在此处输入图片说明

第三步

在RouteConfig.cs中,调用AuthHandler,以便为您的应用程序的每个传入的HTTP请求调用它。 在此处输入图片说明

第四步

在ResetPassword方法中,添加以下实现。在此步骤中,当用户重设密码时,将属性更新为,即他们已重设密码并且没有首次登录。请注意,重设密码时,用户也会被明确注销。

在此处输入图片说明

第5步

在登录方法中,添加以下实现。在此步骤中,如果用户成功登录,请验证其密码是否已重置并且首次登录为假。如果满足所有条件,请更新数据库中的属性,以便这些属性处于准备状态,以备将来用户重置密码时使用。这样的循环确定并更新了密码重置状态,并在重置密码后首次登录。

在此处输入图片说明

最后

您的AspnetUsers表应如下所示

在此处输入图片说明

评论

这就是我的处理方式。我尚未对其进行测试,因此如果遇到异常,您可能需要对其进行修改。还用硬编码显示了解决问题的方法。

  • -1,这没有帮助,这不会阻止在其他浏览器中保存密码。此外,如果您在其他地方再次登录,您将您的 HasResetPassword 字段重置回 false,这样做,您仍然允许其他登录的会话继续使用相同的旧密码。 (3认同)