几年前,我开发了一个网络应用程序,我们希望确保用户不会共享凭据。
我们决定做的事情之一是一次只允许用户从一台计算机登录。我这样做的方法是让一个小 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/