2013-08-26 127 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;只會刪除值,但留下的關鍵。這可能是也可能不是你想要的,但只是想指出區別。