2010-11-22 41 views
0

我們有一個Web應用程序,具有登錄信用卡的功能 重要的要求是,一旦用戶登錄,他是不允許從任何其他系統或甚至在同一系統上的其他瀏覽器登錄 我們使用以下是基於mssql的解決方案:我們將「Is_Loggedin」保留爲表中數據類型爲「bit」的列。當用戶登錄時,我們將標誌設置爲「1」,當某人嘗試再次登錄時,系統顯示錯誤「用戶已登錄」 當用戶登出位變爲「0」時,表示用戶已註銷。 但是這個邏輯在以下情況下多次登錄問題

失敗

問題場景: 當用戶關閉瀏覽器的標誌爲「1」,用戶被鎖定或情況下,當用戶得到系統問題而無法註銷

是有更好的邏輯來處理這個需求?

+0

爲什麼你在網絡環境中有這樣一個奇怪的要求?一個Web應用程序必須能夠處理這個。 – Steven 2010-11-22 13:27:13

+1

該要求可能是爲了防止系統被同一用戶多次同時訪問。這個要求不是所有那些奇怪的IMO,但是當web用戶在系統中或者他們離開時,可靠地檢測是不可能的。 – mellamokb 2010-11-22 13:28:38

回答

0

在用戶登錄時,您可以每隔30秒對用戶登錄的服務器進行一次AJAX調用。在上次發送該AJAX調用的日期/時間有一列Is_LoggedIn和Last_LoggedIn 。如果已超過1分鐘,則允許用戶從另一個系統登錄。

如果用戶將其瀏覽器的打開時間超過會話超時時間(通常爲20分鐘),您也會遇到問題。然後,他們將在下一個請求中註銷,但不能再次登錄,因爲is_LoggedIn設置爲1.您最好做某種基於時間的解決方案,因爲要跟蹤用戶是否仍在使用一個網站是一個非常困難的問題,因爲他們可以通過多種方式離開網站而不需要實際註銷。

如果絕對要避免用戶登錄多個地方的機會,那麼當用戶登錄到新地方時,還可以強制所有其他地方自動註銷。

0

您可以在global.asax的session_end事件中將'Is_Loggedin'標誌更新爲0。 session_end事件始終是調用。 session_timeout到期時會話_end事件調用。

0

後面的global.asax代碼我相信有一個偶會話結束。您可以綁定該方法並將用戶的Is_LoggedIn標誌設置爲0.然後,您還需要將用戶綁定到會話密鑰以便能夠跟蹤用戶的會話。

編輯: 另外,如果用戶關閉瀏覽器,則使用會話cookie或常規cookie可能會有所幫助。 Cookie將在重新打開瀏覽器窗口時對其進行身份驗證;但是,如果用戶使用公用計算機,則存在潛在的安全漏洞。

0

您可能會在不活動的某個時間後(例如30分鐘)將用戶註銷。這樣,如果用戶在不註銷的情況下關閉瀏覽器,他將能夠在30分鐘後再次登錄。

0

使用Session_End Pankaj建議在註銷時確保用戶位設置爲0。

系統故障的問題是另一個問題。也許這可以做到這一點:當用戶登錄時,將用戶的會話ID存儲在數據庫中。當用戶註銷時,清除會話ID。每次用戶發出請求時,都會驗證會話ID是否與存儲在數據庫中的會話ID匹配。如果不是這種情況,則使會話無效,以便用戶註銷。

這應該發生:如果用戶登錄,在另一個瀏覽器中,會話ID將被更新。如果用戶返回到第一個瀏覽器窗口並點擊某個內容,則該會話將失效,用戶將自動退出。