2009-08-24 81 views
1

寻找一个强大的和有效的实现在那里我可以限制用户只能从一台计算机登录到我的web应用程序。限制登录为每个用户在一台计算机在ASP.NET

如果同一用户已经登录和其他人试图从另一台计算机登录,那么我应该或者可以选择

  1. 结束的会议上当前登录的用户,或
  2. 向尝试使用同一用户帐户登录的新人显示消息。

目前认证是使用窗体身份验证与自定义成员资格和角色提供完成。

我们的服务器正显示出它的年龄,所以我正在寻找的是使用最少的处理能力的东西,可能会做很少的DB读取(如果有的话需要)。我最初的幼稚实现是在成功登录时存储IP(在db?app状态?),然后根据场景检查每个页面请求或每个其他日志。想听到更好的想法=)

+1

您无法使用此IP地址。 IP地址可能会在请求之间发生变化,并且由于办公室的布局,来自同一家公司的用户将拥有相同的地址。为什么你想这样做,出于兴趣? – 2009-08-24 07:37:26

+0

就像我说的,天真的执行=) – Fung 2009-08-24 08:30:16

+0

天真与否,永远不要使用IP地址。 – 2009-08-24 10:19:26

回答

0

如果我正确理解你的问题,你想确保每个用户只能在给定时间一次登录。据我所知ASP.NET成员提供程序只存储最后一次活动日期和最后一次登录日期。您可以保留已登录的用户标识列表,并在新用户试图以已经在列表中的用户身份登录时显示您的消息。一个复杂的情况是,当他注销时,你需要从“LoggedOn”列表中删除用户。您可以或许用Session_End中Global.asax中

+0

你如何处理session_end射击的不可靠性? – Fung 2009-08-24 08:30:50

+0

通过添加类似定时器的解决方案来定期清理缓存。第二个想法使用ASP.NET缓存来存储用户名的列表 – edosoft 2009-08-24 09:48:44

4

你可以这样来做:

  • 存储当前的会话ID(HttpContext.Current.Session.SessionID)在Application对象,带有时间戳一起。
  • 在下一请求(例如,在Global.asax),检查是否在当前会话是和以前一样,如果不到20分钟已经过去。如果会话相同,让他们正常工作。如果他们不同,只有在20分钟过后才让他们工作。请更新Application对象。

这将允许一次一个用户在一台计算机上一次。它可能不是100%安全的,但它是一种非常可行的方式。

1

早些时候,我得到了类似的情况,并遵循以下appraoch

  • 随着登录名维护每个请求的会话ID和时间戳。
  • 并且只有在登录&会话ID组合相同时才允许用户访问。
  • 如果组合不同,您可以

    • 注销登录用户第一(通过 显示通知他们
      说的一些其他用户登录到您的
      帐户)0R
    • 注销新输入的用户说已经使用这个 帐户

你可以用请求的时间戳来验证会话超时..

+0

我的答案看起来与skilwz的回应相同...... :(他开始打字时他的回答显示出来...... – RameshVel 2009-08-24 08:06:26

1

嗨 这是我实现这个(我已经添加了这些行到我的页面的基类的onload事件)的方式:

bool authenticated = UserIsAuthenticated(); 

    if (Session["~~~loginprocessed"] == null) 
    { 
    if (authenticated) 
    { 
     // user just logged in: 
     if (Application[Page.User.Identity.Name] != null) 
     Application.Remove(Page.User.Identity.Name); 
     Application.Add(Page.User.Identity.Name, Session.SessionID); 

     Session.Add("~~~loginprocessed", true); 
    } 
    } 
    else 
    { 
    if (!authenticated) 
    { 
     Session.Remove("~~~loginprocessed"); 
    } 
    } 

    if (authenticated) 
    { 
    if ((Application[Page.User.Identity.Name] == null) || (Application[Page.User.Identity.Name].ToString() != Session.SessionID)) 
    { 
     System.Web.Security.FormsAuthentication.SignOut(); 

     // show some message to user which will tell he has signed out because of login from somewhere else! 
    } 
    } 
相关问题