2011-01-05 64 views
3

我使用的是隸屬於MVC2默認項目的MembershipProvider。如何註銷多個不是當前用戶的MembershipUsers?

我希望能夠獲取用戶名的列表,並關閉用戶,並根據需要銷燬他們的會話。我似乎來最接近的是這樣的:

foreach(string userName in UserNames) 
{ 
    MembershipProvider MembershipProvider = new MembershipProvider(); 
    MembershipUser membershipUser = MembershipProvider.GetUser(userName, true); 
    Session.Abandon(); 
    FormsAuthentication.SignOut(); 
} 

我想我需要使用相關的我要註銷用戶會話和/或signout的方法,但我不確定那些地方會。

這樣做的正確方法是什麼?

+0

這不會工作......會議。Abandon()將用於Current HttpContext。不是針對每個用戶的。 – turtlepick 2011-01-05 02:08:38

回答

0

事實證明,這不可能與如此多的的MembershipProvider,但對FormsService。我的最終解決方案竟然是這裏發佈的其他兩個答案的混合體。

我最終在LogOn操作中的帳戶控制器中創建了我自己的FormsAuthenticationTicket。我爲用戶的認證會話生成一個唯一標識符,並將該標識符保存到數據庫。我還將用戶的ID添加到身份驗證票證的UserData部分以進行可靠的查找。默認情況下,授權票只包含他們的用戶名。隨後,FormsAuthenticationTicket會在用戶登錄成功後存儲在cookie中。

基本上所有的取代FormsService.SignIn(model.UserName,model.RememberMe);

我還在Global.asax中添加了public void Application_ReleaseRequestState(object sender,EventArgs args)。我不確定這是否被視爲擴展函數或什麼,因爲它似乎不是一個覆蓋。在Application_ReleaseRequestState內部,它從cookie獲取用戶的FormsAuthenticationTicket。然後解密auth ticket,並從ticket的UserData部分獲取用戶的UserID。然後它詢問數據庫,如果授權票據仍然有效。如果故障單無效,則會將用戶的Cookie設置爲過期。

要強制用戶註銷,我可以在數據庫中更改他們的驗證票證到期日期,或者在數據庫中爲他們的驗證票證切換禁用位。無論哪種方式,當Application_ReleaseRequestState詢問數據庫的auth門票是否有效時,他們將不會。因此,他們的cookies將在用戶點擊進入此檢查後點擊的下一頁時過期。

1

我沒有使用成員資格提供者時,當我這樣做,但基本上我保存SessionId,用戶名和最後一頁訪問數據庫時,用戶登錄。然後每個頁面使用當前SessionID獲取用戶名和相關用戶名,例如當前用戶的顯示餘額等。如果沒有會話的有效用戶,則返回登錄頁面。

這使我能夠通過網站查看用戶進度,並手動斷開所需的任何人並給予我每個用戶的單一登錄。也有)一堆在global.asx頁

+0

我明白如何做到這一點,但我真的很想知道如何使用MembershipProvider來做到這一點。感謝您的建議。 – Sgraffite 2011-01-05 03:05:56

2

這是行不通的清理代碼...

Session.Abandon(將是當前HttpContext。不是像你正在嘗試做的那樣爲每個用戶。 與FormsAuthentication.SignOut()相同。

最好的方法是覈對在Application_AuthenticateRequest事件陣列的當前用戶,並簽署出來有:

protected void Application_AuthenticateRequest(Object sender, EventArgs e) 
    { 
      if (User.Identity.IsAuthenticated) 
      { 
       //add your ckeck here 

       if (Usernames.Contains(User.Identity.Name)) 
        { 
         Session.Abandon(); 
         FormsAuthentication.SignOut(); 
        } 
      }  
    } 
+0

當我硬編碼他們的名字時,我能夠得到這個註銷用戶,但我忍不住想這是一個奇怪的地方,把這個。我需要一些方法來加載我想註銷的用戶名。每次該方法被調用時,這可能意味着數據庫調用。 – Sgraffite 2011-01-05 06:21:37

+0

我覺得這倒退了,因爲在這種情況下,您正在等待用戶在強制登錄之前再次訪問網站。應該有一種方法來使其會話服務器端無效,因此無論如何它們的cookie都將無效。 – Sgraffite 2011-01-05 06:52:03

+0

問題是每個請求都通過一個HttpContext來運行,並且它所處理的模塊之一就是「SessionModule」。那時,你只能閱讀這個請求者的會話。即使做了「打開多少次會話」,你也需要定製邏輯並觀看會話事件。 – turtlepick 2011-01-06 01:53:45

相關問題