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

标签 security

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

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

这个解决方案虽然得到了我的经理的批准,但对我来说总是显得很老套。而且,似乎很容易规避。

有没有一种好方法可以确保网络应用程序用户仅登录一次?说实话,我一直不明白为什么管理层想要这个功能。在分布式应用程序上强制执行此操作是否有意义?

最佳答案

我通过维护当前登录用户的哈希表来实现这一点,键是用户名,值是他们的上次事件时间。

登录时,您只需检查此哈希表中的 key ,如果存在,则拒绝登录。

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

如果哈希表中的不活动时间超过 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);
        }
}

关于security - 如何确保用户只登录一次?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/136837/

相关文章:

python - Python:我可以安全地释放不受信任的数据吗?

java - Android Screencast 失败(请帮助新的 Android Dev)

security - 使用 AspNetUserTokens 表在 ASP.NET Core Web Api 中存储刷新 token

android - 最安全的移动数据库策略

java - 如何禁用 JLabel 的自动 HTML 支持?

php - 使用 extract( $_REQUEST, EXTR_IF_EXISTS ) 安全吗?

php - 部署 WAMP -> 实时站点 - 任何随机提示?

c - RSA_private_decrypt 返回 -1

c# - ASP.NET MVC中如何实现基于Session数据的授权检查?

java - 如何在沙箱中运行不受信任的 Java Swing 应用程序?