杀死用户的会话并通过界面菜单注销

时间:2017-04-18 16:02:06

标签: c# asp.net-mvc session

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

  1. 在应用程序启动时加载SessionsCache
  2. 当用户登录时 - 将他的会话保存在tblSessions中并部分重新加载缓存(在其中添加会话而不调用数据库)
  3. 每隔30秒,ajax将验证我是否有会话
  4. 管理员将拥有一个包含缓存中所有活动会话的界面工具,当他杀死会话时,会从缓存和数据库中删除它
  5. 在下一个ajax调用中,用户将没有会话并且将被注销
  6. 如果用户正常注销缓存中的会话并且数据库将被删除
  7. 每隔30分钟就会完成对缓存的完全重新加载
  8. 请考虑我的应用程序具有OnActionExecuting()覆盖功能,该功能检查用户是否有会话,如果没有登录他。 但这只发生在动作执行上,如果用户没有点击任何地方(afk),他就不会被重定向到主页。 (考虑到检查会话的ajax调用是多余的?)

    此外,我想在不使用LogOut按钮关闭浏览器/标签时清除用户会话,但我不确定如何发生这种情况

1 个答案:

答案 0 :(得分:1)

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

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

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

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

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

  5. 鉴于这一切,你必须从不同的方向来解决这个问题。我的建议是在一般意义上有一个单独的表来跟踪登录/会话。它基本上是一种日志。当用户登录或创建新会话时,您将向此数据库添加记录。如果用户的身份验证或会话过期,您将更新相应的记录。如果用户故意注销,您将删除该记录或以其他方式将其标记为非活动状态。对于您的管理员,他们将管理此表,删除或标记记录为非活动状态。

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

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

    您需要以这种方式添加或说明其他许多内容,但希望这为您提供了一个良好的工作框架。