2011-11-22 57 views
1

我有一個特定的請求,只允許一個用戶因爲web應用程序性質而在時間使用asp.net應用程序。時間只有一個asp.net web應用程序的用戶

我試圖通過使用應用程序狀態來使用某種會話計數器,它在session_start上遞增並在session_end上遞減,但問題在於會話在應用程序顯示登錄表單時立即啓動(因爲表單身份驗證) 。

如果第一用戶的瀏覽器顯示的Login.aspx,在Global.asax中的session_start被調用,sessioncounter增加了1 SessionCounter現在等於1

如果另一個用戶的瀏覽器還顯示login.aspx的,之前第一個用戶認證,在Global.asax中的session_start被調用,sessioncounter爲1 sessionCounter增加,現在等於2

我的想法是,以驗證用戶只有sessionCounter < = 1,但在上描述的情況下,我們將有一個鎖becase的sessionCounter已經是2,如果第一個或第二個用戶試圖登錄,它將無法驗證,因爲sessioncounter大於1。

第二個問題是在認證超時之前會話超時。如果第一個用戶的會話超時,那麼第二個用戶嘗試登錄第二個用戶將會成功進入應用程序。但是如果第一個用戶進行一些回發,因爲他的身份驗證沒有超時,會發生什麼情況。新會話將開始,session_Start事件處理程序將被調用,會話計數器將增加,但用戶仍將登錄,因爲用戶已經過身份驗證。

什麼是最好的方法?是否有可能避免應用程序狀態,因爲如果未使用會話對象,則ASP.net 3.5已知道在session_Start後立即調用session_end的問題。

我想過使用一些數據庫標誌,但後來我會遇到另一個問題。如果用戶在重置此標誌之前關閉瀏覽器會發生什麼情況。舉起旗幟時,我可以插入一些時間戳。然後我會有以下情況:

第一個用戶登錄。引發DB標誌並插入時間戳。第一個用戶忘記註銷並只關閉瀏覽器。

第二個用戶試圖登錄.DB標誌被檢查並且因爲它已經被提出,所以他不能訪問應用程序。如果我再設置一個條件來檢查是否從上次插入的時間戳已經過去了一段時間,例如30分鐘,我可以允許第二個用戶訪問應用程序而不管數據庫標誌,但這不是好的解決方案,因爲我必須等待這段時間。

這個問題的最佳解決方案是什麼? .net框架中是否有全局變量可供我們檢查總在線用戶數量(我沒有使用成員資格提供程序)?

+1

你有沒有嘗試這裏的方法是什麼? http://stackoverflow.com/questions/380167/limiting-number-of-users-accessing-asp-net-website –

+0

謝謝。有效。我不知道我可以從session_start response.redirect。 – Zzz

+0

有一個很好的技巧來解決這個問題......我正在寫入sysdate和用戶名每隔5s到應用程序狀態與ajax ..如果其他用戶試圖訪問此頁我檢查是否有一段時間(例如5分鐘)已從通過應用程序狀態寫入的最後日期傳遞過來。如果有人偶然關閉瀏覽器,則JavaScript將停止將sysdate寫入應用程序狀態,並且下一個用戶將不得不等待一段時間才能訪問此頁面 – Zzz

回答

3

您應該可以通過限制連接數量並添加自定義錯誤頁面來處理403.9 (Forbidden - Too Many Users)錯誤,從而通過IIS執行此操作。

Limiting Connections to Manage Resources (IIS 6.0)

enter image description here

+0

這是很好的解決方案,但我可以不會使用它,因爲我必須與其他一些應用程序共享IIS網站,並且將連接限制爲1會導致其他應用程序連接受限。 – Zzz

+0

您可以限制每個應用程序的連接。 –

相關問題