2013-08-26 88 views
12

我的应用程序拥有对用户权限的控制权,因为并非所有用户都可以访问完整的网站。此时,对于特定用户的所有这些权限都存储在他的会话中,原因对于每次回发搜索数据库都会造成问题。ASP.NET通过Id终止会话

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

有没有办法通过ID杀死一个特定的应用程序会话,迫使用户再次登录?

+1

虽然这不完全是您要查找的内容,但如果您要频繁更改权限,则可能需要查看通过Page.Session.Timeout属性更改会话长度,因为它默认为20分钟。 – user2366842

+0

我明白了你的意思,但我不能那样做。权限不会经常更改,但是我需要在更新时发生更新,同时强制用户再次登录。不幸的是,一些用户功能需要花费太多时间。 –

+0

如果您使用内存中状态,暴力破解方法是在权限更改时重新启动应用程序......请注意,它不适用于正确的进程外提供,如SQL。 –

回答

13
"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指出的那样,如果你有多个服务器,你必须保持服务器之间的数据同步。

+0

谢谢@Guffa。我会尝试你的解决方案,因为我意识到我无法访问其他用户的会话对象。 –

+2

+1“不是其他用户会话对象”......我对“静态集合”的权限非常小心 - 因为它需要代码与实际存储/跨机器保持同步的任何类型的缓存(如果超过在服务该网站)。如果权限检查的正确性很重要,那么吞下权限检查的性能可能更容易。 –

+0

@AlexeiLevenkov:好点。我添加了关于静态变量风险的说明。 – Guffa

1

您可以在此写Session.Abandon();Session.Clear();

Session.SessionID[int index];

店的特定用户会话的值,然后使用Session.Abandon();Session.Clear();

杀死特定会话尝试使用Session.Remove("key");

+3

这会杀死整个会话,而不仅仅是一个特定的部分。 –

+0

@KarlAnderson: - 那是正确的!还更新了我的答案。感谢您的建议!:) –

+1

大概不是OP的想法 - 没有多少用户愿意执行“从我所有的权限”,它似乎更多“从该用户带走权限”... –

-2

要删除特定的一块Session,然后使用Session.Remove(),如th是:

Session.Remove("YourKey"); 

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