【问题标题】:Kill user's session and logout through a interface menu通过界面菜单杀死用户的会话并注销
【发布时间】:2017-04-18 16:02:06
【问题描述】:

你能告诉我如何杀死某人的会话并让他们从我的 MVC 应用程序中注销吗? 我目前的计划是:

  1. 在应用启动时加载 SessionsCache
  2. 当用户登录时 - 将他的会话保存在 tblSessions 中并部分重新加载缓存(在其中添加会话而不使其调用数据库)
  3. 每隔 30 秒,ajax 会验证我是否有会话
  4. 管理员将拥有一个界面工具,其中包含缓存中的所有活动会话,当他终止会话时,他会将其从缓存和 DB 中删除
  5. 在下一次 ajax 调用中,用户将无法进行会话并且会被注销
  6. 如果用户正常注销,缓存和数据库中的会话将被删除
  7. 每 30 分钟对缓存进行一次完全重新加载

请考虑我的应用程序具有 OnActionExecuting() 覆盖函数,该函数检查用户是否有会话,如果没有则注销他。 但是这只发生在动作执行时,如果用户没有点击任何地方(afk),他就不会被重定向到主页。 (考虑到检查会话的 ajax 调用可能是多余的?)

我还想在他关闭浏览器/选项卡而不使用 LogOut 按钮时清除用户会话,但我不确定这怎么会发生

【问题讨论】:

  • 为了让客户端知道会话是否已过期,必须进行 ajax 调用以检查活动会话。
  • 同样要在用户关闭浏览器时清除会话,这也必须涉及轮询。
  • @RyanSearle 你能解释一下什么是投票,或者至少给我一些链接到它的解释吗?谢谢

标签: c# asp.net-mvc session


【解决方案1】:

您提出的解决方案存在一些问题,使其无法实施:

  1. 会话和身份验证都使用客户端 cookie 来管理其状态。服务器只能使身份验证/会话无效。它实际上不能直接“注销”用户,因为该部分不受服务器直接控制。换句话说,您可以设置一些内容,说明应该注销特定用户,但该用户实际上不会注销,直到他们尝试发出另一个请求并且由然后影响当时用户的状态更改的服务器。

  2. 会话采用滑动超时。这意味着客户端发出的任何请求都将重置其会话的超时。换句话说,如果您每 30 秒对会话状态进行一次长轮询,那么用户实际上将拥有一个永不过期的永久会话。

  3. 会话被有意匿名化。出于安全原因,客户端到其会话的唯一链接是带有其会话 ID 的 cookie。这通过使 cookie 成为成功攻击的必备组件来防止一定程度的会话劫持。使用Secure 令牌之类的东西,当然,在您的站点上使用 SSL,您可以有效地防止该 cookie 在分配给它的客户端之外的任何其他上下文中可用。总而言之,除了与该用户的直接联系之外,实际上没有任何方法可以确定哪个会话属于给定用户。

  4. 缓存本质上是易失的。您可以说特定密钥应该有一段时间的生命周期,但这只是一个建议。有许多不同的因素可能导致缓存项目被破坏,大多数完全超出您的控制范围。

考虑到这一切,您必须从不同的方向着手。我的建议是有一个单独的表来跟踪登录/会话,一般来说。它基本上是一种日志。当用户登录或创建新会话时,您将向该数据库添加一条记录。如果用户的身份验证或会话过期,您将更新相应的记录。如果用户故意注销,您将删除该记录或以其他方式将其标记为非活动状态。就您的管理员而言,他们将管理此表,删除记录或将记录标记为非活动记录。

然后,您必须围绕您的站点操作添加一些逻辑来说明此表。您可以创建一个操作过滤器来检查此表并执行任何必要的操作。例如,如果用户已被管理员“注销”,则操作过滤器将从该表中读取相应的记录,查看用户已注销,然后通过实际注销用户来影响该更改。

由于长轮询会导致会话永不过期,因此您基本上需要管理自己的超时。例如,您可以在“日志”表中记录会话的创建时间,然后将该时间与每个后续请求(包括 AJAX)的当前时间进行比较。同样,您可以为此目的使用操作过滤器。如果会话基于您的超时“过期”,那么您可以手动销毁用户的会话。

您还需要以这种方式添加或考虑很多其他内容,但希望这可以为您提供一个良好的工作框架。

【讨论】:

    猜你喜欢
    • 2012-04-03
    • 1970-01-01
    • 1970-01-01
    • 2013-06-04
    • 1970-01-01
    • 2011-10-29
    • 2011-10-09
    • 1970-01-01
    • 2014-03-16
    相关资源
    最近更新 更多