如何确保用户只登录一次?

Est*_*aya 8 security

几年前,我开发了一个网络应用程序,我们希望确保用户不共享凭据.

我们决定采用的一个方面是,只允许用户一次从一台计算机登录.我这样做的方法是每N秒对服务器进行一次iframe; 只要服务器具有特定用户(来自特定IP)的心跳,就不允许该用户从任何其他IP登录.

解决方案虽然得到了我的经理的批准,但对我来说似乎总是很苛刻.而且,似乎很容易规避.

有没有一种方法可以确保Web应用程序用户只登录一次?说实话,我从未理解为什么管理层甚至想要这个功能.在分布式应用程序上强制执行此操作是否有意义?

Fly*_*wat 11

我通过维护当前登录用户的哈希表来实现这一点,关键是用户名,值是他们的最后活动时间.

登录时,只需检查此哈希表的密钥,如果存在,则拒绝登录.

当用户执行任何操作时,您可以使用时间更新哈希表(如果您将其作为核心页面框架的一部分,这很容易).

如果散列表中的时间超过20分钟不活动,则将其删除.您可以在每次检查哈希表时执行此操作,因此即使您只有一个用户,并且尝试在几小时后登录,在初始检查期间,它也会将它们从哈希表中删除以便空闲.

C#中的一些例子(未经测试):

public Dictionary<String,DateTime> UserDictionary
{
    get
    {
        if (HttpContext.Current.Cache["UserDictionary"] != null)
        {
            return HttpContext.Current.Cache["UserDictionary"] as Dictionary<String,DateTime>;
        }
        return new Dictionary<String,DateTime>();
    }
    set
    {
        HttpContext.Current.Cache["UserDictionary"] = value;
    }
}

public bool IsUserAlreadyLoggedIn(string userName)
{
    removeIdleUsers();
    return UserDictionary.ContainsKey(userName);
}

public void UpdateUser(string userName)
{
    UserDictionary[userName] = DateTime.Now;

    removeIdleUsers();
}

private void removeIdleUsers()
{
   for (int i = 0; i < UserDictionary.Length; i++)
        {
            if (user[i].Value < DateTime.Now.AddMinutes(-20))
                user.RemoveAt(i);
        }
}
Run Code Online (Sandbox Code Playgroud)