ASP.NET通过ID终止会话

12

我的应用程序具有用户权限控制,因为并非所有用户都可以访问完整网站。目前,特定用户的所有这些权限都存储在其会话中,因为在每个Post Back时搜索数据库会成为问题。

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

是否有一种方法可以通过ID终止特定的应用程序会话,强制用户重新登录?


1
虽然这不完全是你要找的,但如果你经常更改权限,你可能想通过Page.Session.Timeout属性来更改会话长度,因为它默认为20分钟。 - user2366842
我明白你的意思,但我无法这样做。权限不经常更改,但当发生更改时,我需要立即更新生效,强制用户重新登录。不幸的是,有些用户功能对他来说需要太长时间。 - Bruno Mayer
如果您正在使用内存状态,则暴力方法是在权限更改时重新启动应用程序...请注意,它无法与像SQL这样的适当的进程外提供程序一起使用。 - Alexei Levenkov
3个回答

15
"Is there a way to Kill an specific Application Session by the ID, forcing user to Log in again?"

不可以访问其他用户的Session对象,只能访问当前请求用户(即自己)的Session对象。

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

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

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


谢谢@Guffa。我会尝试您的解决方案,因为我意识到我无法访问另一个用户的Session对象。 - Bruno Mayer
2
+1 在“不使用其他用户会话对象”的操作上……对于权限的“静态集合”,我会非常小心——作为任何类型的缓存,它需要代码与实际存储/跨多台机器保持同步(如果有多个服务器提供站点)。如果权限检查的正确性很重要,那么接受权限检查的性能损失可能会更容易。 - Alexei Levenkov
@AlexeiLevenkov:好观点。我添加了有关静态变量风险的注释。 - Guffa
1
谢谢大家。你们给我的解决方案很好用。对于那些有同样问题的人,这个解决方案使用静态对象,并注意同步即可。 - Bruno Mayer

1

您可以编写Session.Abandon();Session.Clear();

或者Session.SessionID[int index];

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

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


3
这会导致整个会话结束,而不仅仅是某个特定部分。 - Karl Anderson
@KarlAnderson:没错!!我也更新了我的答案。感谢你的建议!!! :) - Rahul Tripathi
1
可能不是提问者想象的情况——很少有用户会自愿执行“取走我所有权限”的操作,更可能是“收回那个用户的权限”…… - Alexei Levenkov

-2
要删除特定的Session,请使用Session.Remove(),如下所示:
Session.Remove("YourKey");

注意:这将从“Session”中删除值和键,虽然您可能会看到人们使用“Session [“YourKey”] = null;”来删除值,但是仅会留下键。这可能是您想要的,也可能不是,但只是想指出区别。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接