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