2008-10-14 13 views
2

在ASP.NET中,我正在尋找一種方法來審計離開應用程序的用戶。具體而言,當用戶的會話因任何原因(不一定是因爲調用session.abandon而被拋棄/銷燬)時,我想在SQL Server的審計表中插入「註銷」記錄。如何在用戶離開ASP.NET應用程序時進行審計

I有一個'SessionHelper'類來管理會話設置者/獲取者。

我試着在Global.asax中的Session_End中回發,但它從來沒有在超時過期後解僱這個事件。

我試過在SessionHelper類中重寫'finalize',並在類被銷燬時做到這一點,但它並沒有觸發該事件。

我想嘗試在SessionHelper中實現IDisposable,但我不知道在哪裏調用它,以便它總是被調用。

審覈離開您的ASP.NET應用程序的用戶的正確方法是什麼?

謝謝!

回答

2

如果您擁有InProc會話,則只會觸發Session_End事件。 SQL或狀態服務器會話管理不會觸發此事件。如果可以,請返回InProc會話並使用此事件。

除此之外,你不會得到很好的解決方案。 ASP.NET沒有提供查看服務器上當前會話列表的方法(至少,StackOverflow的用戶無法知道,因爲我已經提出了這個問題),所以你不能使用任務來檢查它們何時被銷燬。

第二好的事情是將「上次訪問時間」存儲在您的用戶的某個位置,並用它來檢測會話超時。雖然這樣的工作很複雜(如果用戶快速登錄/註銷,您可能會錯過註銷事件)...

因此,這裏沒有完美的解決方案。

2

請注意關於「正確的方式」,但以下是我過去如何做到的。

有一個「活動」日期 - 與數據庫中的用戶記錄相關聯的時間戳記。每次用戶訪問一個頁面,該頁面都會更新到當前時間。如果有人在15分鐘內未訪問該頁面,則該用戶被記錄爲「註銷」事件,並且時間戳被設置爲NULL。

+0

我做了類似的事情,我使用基於sql的會話處理,並在持有我的會話數據的表中擁有最後訪問的列。每次修改會話記錄時都會存儲一個存儲過程,該過程會清理不活動時間長於預定義TIMEOUT值的任何未使用會話行的表。 – stephenbayer 2008-10-14 15:54:41

1

即使您確實讓會話事件正常工作,您的註銷記錄也會成爲一種智能猜測,即使用戶離開您的網站/應用時也是如此。您可能使用的一種技術是在用戶登錄時將註銷時間放入數據庫,並且在使用系統時隨時更新記錄。這是我最近使用撰寫會話表的一般模式:

[Id] [Uid] [LoginInOn]  [ExpiresOn] 
1 johndoe 10/14/2008 10:47 10/14/2008 11:07 

在這個表我只是不停地在用戶與應用程序(當前時間+ 20分鐘)進行交互更新ExpiresOn列。如果他們嘗試在ExpiresOn之後進行交互,那麼我知道他們閒置了20分鐘並強制進行新的登錄。出於報告目的,如果當前時間大於ExpiresOn,我知道用戶已註銷。你可以比這更復雜。例如,我將數據從上面列出的會話表中移出到具有常規流程的報告表中。這只是爲了保持會話表小,因爲很多東西與它交互。

相關問題