【问题标题】:ASP.NET Kill Session By IdASP.NET 按 ID 终止会话
【发布时间】:2013-08-29 08:12:37
【问题描述】:

我的应用程序可以控制用户权限,因为并非所有用户都可以访问完整的网站。此时,特定用户的所有这些权限都存储在他的会话中,因为我每次回发都在数据库中搜索会是一个问题。

问题是当我删除一个权限时,用户仍然可以访问该页面,并且只有当他关闭浏览器时,更新才会生效。

有没有办法通过 ID 杀死特定的应用程序会话,强制用户重新登录?

【问题讨论】:

  • 虽然这不是您想要的,但如果您经常更改权限,您可能希望通过 Page.Session.Timeout 属性查看更改会话长度,因为它是默认为 20 分钟。
  • 我明白你的意思,但我做不到。权限不经常更改,但我需要当它发生时,更新同时生效,强制用户重新登录。不幸的是,一些用户功能对他来说花费了太多时间。
  • 如果您使用内存状态,暴力破解方法是在权限更改时重新启动应用程序...请注意,它不适用于 SQL 等适当的进程外提供。

标签: c# asp.net session sessionid


【解决方案1】:

你可以写Session.Abandon();Session.Clear();

Session.SessionID[int index];

在其中存储特定的用户会话值,然后使用Session.Abandon();Session.Clear();

要终止特定会话,请尝试使用 Session.Remove("key");

【讨论】:

  • 这会杀死整个会话,而不仅仅是一个特定的片段。
  • @KarlAnderson:- 没错!!也更新了我的答案。谢谢建议!!!! :)
  • 可能不是 OP 想到的场景 - 没有多少用户会心甘情愿地执行“从我那里获取所有权限”,似乎更多的是“从该用户那里获取权限”......
【解决方案2】:

要删除Session 的特定部分,然后使用Session.Remove(),如下所示:

Session.Remove("YourKey");

注意:这会从Session 中删除值和键,而您可能会看到人们使用Session["YourKey"] = null; 只会删除值,但保留键。这可能是也可能不是您想要的,但只是想指出区别。

【讨论】:

    【解决方案3】:
    "Is there a way to Kill an specific Application Session by the ID, forcing user to Log in again?"
    

    没有。您只能访问执行当前请求的用户(即您自己)的 Session 对象,不能访问其他用户的 Session 对象。

    因此,您需要将用户的 id 存储在其他地方,例如在静态集合中。当用户发出下一个请求时,您可以检查 id 是否在集合中,并更新权限或注销用户。

    另一种选择是将所有当前登录用户的权限对象保存在静态集合以及他们的 Session 变量中。这样您就可以在不访问该用户的 Session 对象的情况下更改权限对象。

    在 Web 应用程序中使用静态变量当然需要注意一些常见的预防措施。由于多个线程可以访问它,因此必须同步访问。此外,正如 Alexei Levenkov 指出的那样,如果您有多个服务器,则必须保持服务器之间的数据同步。

    【讨论】:

    • 谢谢@Guffa。我会尝试您的解决方案,因为我意识到我无法访问其他用户的 Session 对象。
    • +1 on "not other users Session objects"...我会非常小心“静态集合”的权限 - 因为任何类型的缓存都需要代码与实际存储保持同步/ 跨机器(如果超过 on 服务于站点)。如果权限检查的正确性很重要,则可能更容易吞下权限检查的性能损失。
    • @AlexeiLevenkov:好点。我添加了关于静态变量风险的注释。
    • 谢谢大家。你们两个给我的解决方案效果很好。对于那些有同样问题的人,解决方案是使用静态对象,注意同步。
    猜你喜欢
    • 2011-07-16
    • 2013-12-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-12-19
    • 1970-01-01
    相关资源
    最近更新 更多