[英]How to log off multiple MembershipUsers that are not the current user?
我正在使用隸屬於MVC2默認項目的MembershipProvider。
我希望能夠獲取用戶名列表,並關閉用戶,並在需要時銷毀他們的會話。 我似乎最接近的是:
foreach(string userName in UserNames)
{
MembershipProvider MembershipProvider = new MembershipProvider();
MembershipUser membershipUser = MembershipProvider.GetUser(userName, true);
Session.Abandon();
FormsAuthentication.SignOut();
}
我想我需要使用與我想要注銷的用戶相關的會話和/或注銷方法,但我不確定它們會在哪里。
這樣做的正確方法是什么?
這不會奏效......
Session.Abandon()將用於Current 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();
}
}
}
當我這樣做時,我沒有使用會員提供商,但基本上我保存了用戶登錄時在數據庫中訪問的SessionId,Username和lastPage。 然后,每個頁面使用當前的SessionID來獲取用戶名並執行相關的用戶名內容,例如當前用戶的顯示余額等。如果沒有該會話的有效用戶,則返回登錄頁面。
這讓我看到了用戶在網站上的進展,並手動斷開了我想要的任何人並給了我每個用戶的單點登錄。 global.asx頁面中還有一堆清理代碼
事實證明,這與MembershipProvider沒有多大關系,而是與FormsService有關。 我的最終解決方案被證明是這里發布的另外兩個答案的混合體。
我最終在LogOn操作中的Account控制器中創建了自己的FormsAuthenticationTicket。 我為用戶的經過身份驗證的會話生成唯一標識符,並將該標識符保存到數據庫中。 我還將用戶的ID添加到auth票證的UserData部分以進行可靠查找。 默認情況下,auth票證僅包含其用戶名。 然后,在用戶成功登錄后,FormsAuthenticationTicket將存儲在cookie中。
基本上所有這些都取代了FormsService.SignIn(model.UserName,model.RememberMe);
我還在Global.asax中添加了public void Application_ReleaseRequestState(object sender,EventArgs args)。 我不確定這是否被視為擴展功能或什么,因為它似乎不是一個覆蓋。 在Application_ReleaseRequestState內部,它從cookie獲取用戶的FormsAuthenticationTicket。 然后它解密auth票證,並從票證的UserData部分獲取用戶的UserID。 然后,它詢問數據庫是否仍然有效。 如果故障單無效,則會將用戶的cookie設置為過期。
要強制用戶注銷,我可以在數據庫中更改其身份驗證票證到期日期,也可以在數據庫中切換其身份驗證票證的禁用位。 無論哪種方式,當Application_ReleaseRequestState詢問數據庫時,如果他們的身份驗證票證有效,他們就不會。 因此,他們的cookie將設置為在用戶在進行此檢查后命中的下一頁上過期。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.