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

阻止用户两次登录web应用程序的最简单方法是什么

  •  1
  • Michel  · 技术社区  · 15 年前

    我有用户可以登录到我的网站。 我不使用asp.net提供程序(我有自己的用户存储),但使用表单身份验证。

    不,我想阻止用户两次登录到我的应用程序。

    现在最简单的事情是什么?

    我想在用户记录的数据库中添加一个字段

    但是有更简单的吗?对于整个应用程序,是否有一种“会话”可以让我记住哪些人登录(哪些不是随机刷新的)?

    可能在缓存中(但缓存有时会刷新)

    我看到一个例子,其中一个用户名为的文件被写入磁盘(并在注销时被删除)

    编辑:

    好问题是:登录两次是什么意思。我的意思是当一个用户登录到另一台计算机上,或者当另一个人使用相同的凭据登录时

    4 回复  |  直到 15 年前
        1
  •  2
  •   Oded    15 年前

    这个 Session 对象确实是MVC和分类ASP.NET中的最佳选项。

    默认情况下,会话将在用户不活动20分钟后超时,因此在该(可配置)时间段之后,会话将“自动”注销。

    在您的代码中,只需确保 System.Web 程序集被引用,您可以使用 会议 反对。


    更新 (以下问题更新):

    要跨计算机/浏览器跟踪登录状态,您需要一种跟踪“有效”登录的方法。

    一个很好的方法是发出“ticket”-这是一个令牌,可以存储在数据库中(针对用户记录),浏览器在每次请求时返回(cookie是返回它的好方法)。

    当用户登录时,您将签发一张票据。如果此票证与cookie中的不匹配,则将其注销。只有浏览器/计算机 现在的 将登录票证。

        2
  •  1
  •   Vnuk    15 年前

    “用户名写在磁盘上的文件”基本上是一个扭曲的会话控制。

    你说两次登录是什么意思?

    如果使用Cookie来知道它们是否被登录,那么如果cookie存在(cookie内容当然是有效的),那么就不要向他们显示登录表单。

    会话将在过期时刷新(迟早会刷新)。

        3
  •  1
  •   Adam    15 年前

    你可以使用 HttpApplicationState 对于这个,它是会话状态的应用程序范围的等价物,可以通过 HttpContent.Application 从控制器内部。

        4
  •  0
  •   Steven Quick    13 年前

    假设您的意思是两个不同的人同时使用相同的凭据登录,在ASP.NET中实现这一点的一种实用方法是:

    1:将FormsAuthentication超时和SessionState超时设置为相同的值,例如:30分钟

    2:作为登录代码的一部分,将UserId、SessionId、lastaction和iseended存储在DB表或内存缓存/服务器中。

    3:在您的Global.asax In Authenticate_请求中,如果您有当前用户的多个记录,例如:lastaction within Now Timeout,而IsEnded=false,则您有重复的登录。

    您还需要在每个请求上更新当前用户的UserSession记录的LastActiveOn日期(执行此异步操作以使其不会阻塞)。

    4:注销时,记得调用Session.about()并在UserSession record中为当前用户的记录设置IsEnded=true值。您还应该为所有其他用户的UserSession记录设置IsEnded=true,其中lastaction比Now Timeout旧。

    你必须处理的第一件棘手的事情是当用户关闭浏览器而不注销,然后他们试图在超时时间内再次登录。处理此问题的最简单方法是在登录时结束该用户的所有其他会话。这意味着最新的登录将保留,而较早的登录将被踢出。如果你想要相反的行为,那就更难了,你需要在会话结束时使用,或者在浏览器关闭时使用js ajax调用(这是不可靠的)。

    第二个需要处理的棘手问题是持久登录,如果您的站点允许永久存储表单身份验证cookie,则您还需要使用Session_Start创建新的/当前的用户会话记录以及登录时的记录。

    如果您不想依赖SessionState(例如:负载平衡的web服务器),您可以在登录时创建一个唯一的id,并将其存储在FormsAuth cookie数据或共享内存缓存服务器(如果您运行memcache、redis、velocity等)中的某个位置,然后使用它而不是SessionId。

    推荐文章