将每个用户的登录限制为ASP.NET中的单台计算机

时间:2009-08-24 07:34:11

标签: asp.net authentication

寻找强大而有效的实施方案,我可以限制用户只从一台计算机登录我的网络应用程序。

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

  1. 结束当前登录用户的会话,或
  2. 向尝试使用同一用户帐户登录的新用户显示一条消息。
  3. 目前,使用带有自定义成员资格和角色提供程序的表单身份验证进行身份验证。

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

4 个答案:

答案 0 :(得分:4)

你可以这样做:

  • 将当前会话ID(HttpContext.Current.Session.SessionID)与时间戳一起存储在Application对象中。
  • 在下一个请求中(例如在Global.asax中),检查当前会话是否与之前相同,并且是否已经过了不到20分钟。如果会话相同,请让它们正常工作。如果它们不同,只有在20分钟过后才让它们工作。请更新Application对象。

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

答案 1 :(得分:1)

早些时候,我遇到了类似的情况,并按照以下方式进行了评估

  • 与登录名一起在每个请求中维护会话ID和时间戳。
  • 并允许用户仅在登录和登录时才能获得访问权限。会话ID组合相同。
  • 如果组合不同,您可以

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

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

答案 2 :(得分:1)

您好 这是我实现它的方式(我已经将这些行添加到我的Page的基类的上传中):

  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!
    }
  }

答案 3 :(得分:0)

如果我正确理解您的问题,您希望确保每个用户只能在给定时间登录一次。据我所知,ASP.NET成员资格提供程序仅存储上次活动日期和上次登录日期。您可以保留已登录的用户ID列表,并在新用户尝试以该列表中已有的用户身份登录时显示您的消息。一个复杂的问题是,当你注销时,你需要从这个'LoggedOn'列表中删除用户。您也许可以在Global.asax

中使用session_end