你能告诉我如何杀死某个人的会话并让他们从我的MVC应用程序注销。 我目前的计划是:
请考虑我的应用程序具有OnActionExecuting()覆盖功能,该功能检查用户是否有会话,如果没有登录他。 但这只发生在动作执行上,如果用户没有点击任何地方(afk),他就不会被重定向到主页。 (考虑到检查会话的ajax调用是多余的?)
此外,我想在不使用LogOut按钮关闭浏览器/标签时清除用户会话,但我不确定如何发生这种情况
答案 0 :(得分:1)
您提出的解决方案存在一些问题,使其无法使用:
会话和身份验证都使用客户端cookie来管理其状态。服务器只能使身份验证/会话无效。它实际上不能直接“注销”用户,因为该片段不受直接服务器控制。换句话说,您可以设置一些内容,指出特定用户应该注销,但该用户实际上 注销,直到他们尝试发出另一个请求并且某些检查由然后,服务器会影响用户当时的状态更改。
会话采用滑动超时。这意味着客户端发出的任何请求将重置其会话的超时。换句话说,如果您每30秒对会话状态进行一次长时间轮询,则用户将有效地进行永不过期的永久会话。
会话是故意匿名的。出于安全原因,客户端唯一的会话链接是带有会话ID的cookie。这可以通过使cookie成为成功攻击中的必备组件来防止某种程度的会话劫持。使用Secure
令牌之类的东西,然后当然在您的网站上使用SSL,您可以有效地防止该cookie在除分配给它的客户端之外的任何其他上下文中使用。长期和短期是,除了与该用户直接联系之外,没有任何方法可以确定哪个会话属于给定用户。
缓存本质上是易变的。你可以说特定的键应该有一段时间的生命周期,但这只是一个建议。有许多不同的因素可能会导致缓存项目被破坏,大多数完全超出您的控制范围。
鉴于这一切,你必须从不同的方向来解决这个问题。我的建议是在一般意义上有一个单独的表来跟踪登录/会话。它基本上是一种日志。当用户登录或创建新会话时,您将向此数据库添加记录。如果用户的身份验证或会话过期,您将更新相应的记录。如果用户故意注销,您将删除该记录或以其他方式将其标记为非活动状态。对于您的管理员,他们将管理此表,删除或标记记录为非活动状态。
然后,您必须在网站操作周围添加一些逻辑来说明此表。您可以创建一个动作过滤器来检查此表并执行任何必要的操作。例如,如果用户已被管理员“注销”,则操作过滤器将从此表中读取相应的记录,查看用户是否已注销,然后通过实际签署用户来影响该更改。 / p>
由于长轮询会导致会话永不过期,因此您基本上需要管理自己的超时。例如,您可以在“日志”表中记录创建会话的时间,然后将该时间与每个后续请求(包括AJAX)上的当前时间进行比较。同样,您可以为此目的使用动作过滤器。如果会话根据您的超时“过期”,那么您可以手动销毁用户的会话。
您需要以这种方式添加或说明其他许多内容,但希望这为您提供了一个良好的工作框架。