从另一台计算机登录时,从其他计算机(以前登录过)注销用户

时间:2019-02-11 09:57:00

标签: asp.net-core

我有一个Web应用程序,员工可以登录以执行工作。我要达到的目的是:当用户从计算机登录时,如果他已经在另一台计算机上登录,则必须注销该用户。该Web应用程序首先是MVC Asp.Net Core 2.2代码。我在启动时添加了signInManager并编辑了PasswordSignInAsync方法。我从两个不同的设备登录系统。当我从登录的第一台计算机上单击屏幕上的某项时,它将重定向到注销。好像在工作。但是我不确定这是否是正确的方法。我添加的代码是:await UserManager.UpdateSecurityStampAsync(user);内部的PasswordSignInAsync方法。

在我添加的启动类ConfigureServices方法内

     'services.AddIdentity<ApplicationUser, ApplicationRole>()
            .AddSignInManager<SignInManagerX>()'

然后在从SignInManager继承的SignInManagerX类中,我重写了PasswordSignInAsync

public override async Task<SignInResult> 
PasswordSignInAsync(ApplicationUser user, string password,
       bool isPersistent, bool lockoutOnFailure)
    {
        if (user == null)
        {
            throw new ArgumentNullException(nameof(user));
        }

        var attempt = await CheckPasswordSignInAsync(user, password, 
lockoutOnFailure);
//Here is added
        if (attempt.Succeeded)
        {
            await UserManager.UpdateSecurityStampAsync(user);
        }
//Add end
        return attempt.Succeeded
            ? await SignInOrTwoFactorAsync(user, isPersistent)
            : attempt;
    }

这是正确的方法吗?或者如果用户已经在另一个Ip上登录,我应该向登录数据库添加一个表来保存信息。然后,如果最后一次和当前的登录尝试为true,则从所有计算机注销该用户?

1 个答案:

答案 0 :(得分:0)

是的,SecurityStamp的主要目的是允许在任何地方注销。

基本思想是,每当用户更改与安全性相关的某些内容(例如密码)时,最好自动使任何现有的登录Cookie失效,因此,如果您的密码/帐户先前遭到破坏,则攻击者不再有访问权限。

参考:https://stackoverflow.com/a/19505060/5751404

您可以将validateInterval设置为TimeSpan.Zero以便立即注销。