2009-06-25 67 views
4

我們構建了一個Intranet應用程序,用戶必須登錄才能執行某些任務... 我們必須確保沒有「應用程序用戶」多次登錄與此同時。如何防止同一用戶在不同的電腦上同時登錄

因此,我現在所做的是將當前的asp.net會話ID存儲在數據庫中,然後比較每個頁面加載時它們是否相同。會話ID在用戶登錄時存儲在數據庫中。

但是通過使用這種檢查,總是需要一個數據庫選擇。所以我不太喜歡這種方式。必須有更好的方法來解決這個問題,或者?

我們使用ASP .NET2,C#..

預先感謝任何輸入

[信息更新]

我已經創建了一個自定義的MembershipProvider和定製Membershippuser。 Membershipuser有一個名爲「StartSession(string sessionId)」的方法,當用戶登錄時使用該方法。

其他方法CheckSession(字符串sessionId)用於每個回發,並將當前會話ID與會話ID存儲在數據庫中。

[更新] 謝謝大家的意見。我現在將使用緩存來防止永久數據庫訪問。我首先想到已經有一個Class或者某個東西已經在處理這個問題。

+0

一個數據庫查詢不應該擔心無用,你有大量的trafik .. – Peter 2009-06-25 09:36:54

+0

值得確保有一個真正的原因這個限制,因爲它也會影響一臺機器上的一個用戶打開兩個瀏覽器。並且可能無法檢測到打開兩個選項卡的單個瀏覽器。 – Richard 2009-06-25 09:36:56

+0

我們不希望人們打開它的標籤,他們應該只有一個窗口打開,這也是一個許可證問題...我們不希望他們購買一個用戶許可證,並將其用於100人.. 。所以它確保應用程序正常工作,並且許可證正確使用 但是也許這是一個錯誤的想法無論如何... – nWorx 2009-06-25 09:40:40

回答

4

您現有的將這些信息存儲在數據庫中的方法是合理的,它有助於擴大事情。

但是,您也可以使用System.Web.Caching.Cache對象跟蹤用戶當前會話。如果查找緩存對象中的信息失敗,則會退回到從數據庫中讀取該信息,然後將該信息放入緩存中以利於後續請求。

3

我建議的主要改變是你創建一個會話緩存來檢查,而不是每個頁面加載使用數據庫。

它會以類似的方式工作 - 您將檢查緩存中的會話ID以驗證並在驗證失敗時採取相同的操作。你只是不需要進行數據庫調用。

1

由於其他答案的狀態,緩存將在這裏給你一個性能提升,但要檢查你是否真的需要這個內部網應用程序。

您所描述的內容打破了Web應用程序的標準模型,並且我會質疑純粹由於許可原因而產生的價值。特別是如果您打算嘗試阻止人們打開多個標籤 - 您可能會着手執行一項非常困難的任務,這隻會降低用戶體驗的質量。

-2

做來回用戶登錄一個數據庫產生額外場上主動或相似的東西。在用戶身份驗證中檢查用戶表中此字段的值(如果它已爲true)如果Active的值爲false,則通過javascript「用戶已登錄」顯示消息,更新並將其設置爲true,並將用戶驗證爲下一頁或形成。在用戶驗證後,在導航的next page_page事件中檢查此事件。如果用戶已經登錄,那麼頁面控件可以只讀,否則可以在頁面上更改記錄。

我用這個,它工作。我的應用程序中沒有會話。

相關問題