2009-01-26 90 views
3

我基本上正在尋找與FormsAuthentication_OnAuthenticate相反的事件。我想在用戶註銷時從數據庫中刪除一些值。我試着把它放到Session_End事件中,但似乎用戶在執行時已經消失了。當formauthenticated用戶未經身份驗證時捕獲的事件

更新: 如果我無法確定某個特定用戶何時被解除身份驗證(即由於會話超時),那麼是否有辦法獲取所有當前通過身份驗證的用戶的列表?如果可以的話,那麼在Session_End中,我可以從數據庫中刪除與當前已通過身份驗證的用戶無關的記錄。

回答

2

Session_End無法啓動 - 如果您沒有使用InProc會話,則它根本不會啓動。如果您的應用程序再次回收或死亡,它不會觸發。

您最好的選擇是在一個共享的方法,這個代碼,您可以從許多地方撥打:

  1. 在你LoginStatus的控制,你可以設置LoggingOut事件 - 打電話給你的方法有處理人誰明智地註銷。
  2. 如果您在Session_End事件中使用InProc會話,但請確保檢查是否已經註銷(如您所見)。
  3. 如果您不使用InProc會話,則需要獲得更多的創意。也許看看有一個事件會不時發生(可能是在Session_Start中不管發生什麼事情),並清除那些上次活動時間比會話超時更早的用戶(如Greg所述)。

Unforunately的Membership class爲您提供了一些有用的信息,但不是所有的人:

GetNumberOfUsersOnline 

這將「獲取用戶數當前訪問的應用程序。「 - 偉大的,但唯一的方法,將讓用戶可以:

GetAllUsers  // Gets all the users from the storage provider (can be paged) 
FindUsersByName 
FindUsersByEmail 

可悲的是這些都沒有的屬性只返回‘活躍用戶’按計數

看的MembershipUser成員。沒有「IsOnline」屬性 - 只有LastLogonDate和LastActivtyDate - 由於網絡的連接性,這可能與您將要獲得的一樣好。

0

我會想象你有他們通過點擊一個按鈕或鏈接或類似的東西註銷。爲什麼不把代碼放在同一個事件/塊中。在您放置FormsAuthentication.SignOut()調用的位置附近。

0

Global.asax中有一個Session_End處理程序,您可以在會話過期時將其放入。

我不確定這是你想要的。會話和身份驗證是兩回事。如果您的身份驗證技術向用戶(在cookie內)提供FormsAuthenticationTicket並且該憑單已過期,那麼通過此憑單控制身份驗證到期。它不會在服務器上進行主動管理。每個請求都會提供用戶提供的票據,然後服務器將確定用戶是否仍然通過身份驗證。底線是,您可以檢測用戶的會話何時到期,但您可能無法確定其身份驗證何時到期,除非兩個到期值都相同。

0

如果您使用SQL提供程序,則aspnet_Users表具有「LastActivityDate」列。如果您將其與表單身份驗證的超時值進行比較,您可以想出一個用戶列表,但肯定沒有登錄。如果他們通過「註銷」鏈接手動註銷,您的計數會很低。

相關問題