代码之家  ›  专栏  ›  技术社区  ›  Fung

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

  •  1
  • Fung  · 技术社区  · 17 年前

    寻找一个健壮和有效的实现,我可以限制用户只登录到我的web应用程序从一台计算机。

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

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

    当前的身份验证是使用具有自定义成员身份和角色提供程序的表单身份验证完成的。

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

    4 回复  |  直到 17 年前
        1
  •  4
  •   Sklivvz    17 年前

    你可以这样做:

    • 存储当前会话ID( HttpContext.Current.Session.SessionID 在 Application 对象,以及时间戳。
    • 在下一次请求时(例如 Global.asax ),检查当前会话是否与以前的会话相同,以及是否超过20分钟。如果会话相同,则让它们正常工作。如果它们不同,只有在20分钟后才让它们工作。更新 应用 对象。

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

        2
  •  1
  •   RameshVel    17 年前

    早些时候我也遇到过类似的情况

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

      • 注销第一个登录的用户(通过 向他们显示通知
        说有其他用户登录到您的
        帐户)
      • 注销刚输入的用户 帐户正在使用中

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

        3
  •  1
  •   Shahab    15 年前

    您好! 这就是我实现它的方式(我将这些行添加到页面基类的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!
        }
      }
    
        4
  •  0
  •   edosoft    17 年前

    如果我正确理解您的问题,您希望确保每个用户在给定时间只能登录一次。据我所知,asp.net成员资格提供程序只存储最后的活动日期和最后的登录日期。您可以保留已登录的用户ID列表,并在新用户尝试以已在该列表中的用户身份登录时显示您的消息。一个复杂的问题是,当用户注销时,需要将其从“loggedon”列表中删除。您也许可以在global.asax中使用session\u end