代码之家  ›  专栏  ›  技术社区  ›  Josh Curren

允许每个用户一次登录一台机器的登录系统设计

  •  3
  • Josh Curren  · 技术社区  · 16 年前

    我应该如何设计一个登录系统,使每个用户名一次只能在一个地方登录?我想阻止用户将用户名提供给其他人登录,这样他们就可以避免为每个用户付费。

    如果用户已登录并尝试登录另一台计算机,我是否应阻止第二次登录(如果用户在工作时登录,然后尝试在家登录,这可能是一个问题)?还是应该允许第二次登录并结束第一次登录?还是有人有更好的建议?

    8 回复  |  直到 16 年前
        1
  •  7
  •   Pekka    16 年前

    一些即时消息传递者(只能与一个登录的端点一起工作)有一种很好的方式来解决此类冲突。它们显示的信息

    您已经从登录 <COMPUTERNAME>

    (如果是网络应用,那么 <IP/Browser> )

    给你一个选择

    • 使该登录处于活动状态(而不是从您所在的计算机登录),或者
    • 正在结束现有登录(并登录当前计算机)。

    这在技术上是最具挑战性的,但绝对是最友好的方式——它确保用户只有一个会话在运行,而不会太明显。也没有恶意用户因为忘记在工作中注销而无法登录,等等。

        2
  •  2
  •   Tyler Carter    16 年前

    我相信暴雪的魔兽世界能很好地实现这一点。

    基本上,如果您在已经登录后尝试登录游戏,则第一个连接将被启动。

    这基本上只需要将会话存储在数据库中。当您存储会话数据时,也存储一个用户名。当用户登录时,删除任何具有该用户名的会话记录,然后为登录人员创建一个新的会话记录。

    我不建议阻止“新”用户尝试登录,因为用户不想仅仅因为忘记注销而返回到他们拥有的另一台计算机(可能有几英里远)。


    你可能还需要考虑其他一些事情。像sessionid劫持之类的。如果用户只使用正确的sessionid在其系统上放置一个cookie(这始终是可能的),那么他们可能会在多台计算机上使用相同的会话。在这种情况下,您可能希望保留一个IP字段,用于保存当前登录的数据。

        3
  •  2
  •   mjv    16 年前

    解决这个问题的一个典型方法是使用

    非活动超时。

    此系统强制每个帐户的最大登录次数,同时考虑到上述情况:用户离开办公室而不注销,并尝试从其主工作站登录。

    这是这样一个系统的一般路线

    • 每个帐户都与许多允许的并发登录(也称为“席位”)相关联(似乎每个帐户的操作人员都希望一个且只有一个,但这可能会更多,并且会因帐户而异)。
    • 许可证管理器逻辑保存当前登录的所有帐户/用户的列表,以及带有“最后”活动的时间戳。
    • 在服务任何页面之前,Web应用程序调用许可证管理器(LM)。其目的是允许lm更新“last”活动的时间戳,同时在获得许可证的情况下拒绝调用(更多内容见下文)。
    • 每次登录时,许可证管理器逻辑都会验证占用的座位数量是否不超过为帐户指定的数量。
    • 如果不是这样,那么lm只需将当前会话添加到活动会话列表中。
    • 如果是这种情况,lm将检查列表中早于超时时间段的会话。如果找到一个,它将禁用它,并授予对新登录的访问权。如果找不到,则拒绝登录。
    • 每次[显式]注销时,lm都会从活动会话列表中删除相应的会话。

    请注意,上述一般原则可能会有一些变化,特别是:

    • 与其默默地、系统地使[通常是最老的]超时会话无效,还不如通知当前正在尝试登录的用户这种情况,并让他/她决定是否需要“终止”这样的会话。
    • 为了避免在每次新的页面请求中给lm增加负担,Web应用程序可以根据lm中会话上次“刷新”后的时间来跟踪每个会话,并且仅当该时间超过超时时间的1/3时才调用lm。

    独立于lm逻辑本身,记住 所有与lm相关的事件的日志 (登录、注销、非活动会话“终止”、拒绝登录…)。此类日志应包括日期/时间、IP地址和其他相关信息,并且在解决与被盗密码等相关的问题时非常有用。此类日志还包含无价的营销,例如查找所有似乎座位太少的账户(因此可能购买一些ugrade),或查找风险账户等。

    还有一些考虑

    • 方便用户注销(大多数每页的注销按钮/链接都在固定位置
    • 方便用户报告密码冲突/被盗情况
        4
  •  1
  •   erenon    16 年前

    阻止第一次登录。如果你在家登录,那么在工作中,你不想被阻止,因为这是一个合法的方法。总是允许当前登录,并删除旧的登录。

        5
  •  1
  •   Aaron    16 年前

    我建议跟踪每个用户是否登录,并允许第二次登录结束第一次登录的会话。

    然后,允许会话结束的用户在错误启动时报告可能的欺诈活动。

        6
  •  0
  •   symcbean    16 年前

    不要试图通过计算用户拥有活动会话的IP地址数来实现这一点-有些用户可能落后于负载平衡代理。

    解决方案是编写您自己的会话处理程序(可能最容易使用数据库后端),并且只允许一个用户拥有一个打开的会话。

    您可能需要调整会话垃圾收集和不活动状态。您还应该确保您的系统不受会话固定攻击的影响。

    C.

        7
  •  0
  •   kalpaitch    16 年前

    在安全性方面,这正是您要了解的内容,无论如何,最好将会话数据存储在数据库中。尤其是在共享服务器上。

    就允许哪个用户使用,哪些用户可以删除,这是你要判断的问题。我想你可以有一些二级身份证明,以确保他们是帐户的真正所有者。实际上注册的那个人。

        8
  •  0
  •   AaronS    16 年前

    我以前在一个具有相同要求的Web应用程序中做过这项工作。我是这样做的:

    当有人登录时,您将生成一个guid并将其存储在数据库中,附加到用户。您还可以将这个相同的GUID存储在会话cookie中。

    每次登录用户访问您站点上的任何页面时,您都会检查他们的cookie guid,并将其与数据库中分配给他们的guid进行比较。如果这些guid不匹配,那么它们已经登录到另一台机器上,而您将它们从该会话中注销。

    这种方法非常有效。

    推荐文章