如何注销不是当前用户的多个MembershipUser?

我正在使用隶属于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页面中还有一堆清理代码

事实certificate,这与MembershipProvider没有多大关系,而是与FormsService有关。 我的最终解决方案被certificate是这里发布的另外两个答案的混合体。

我最终在LogOn操作中的Account控制器中创建了自己的FormsAuthenticationTicket。 我为用户的经过身份validation的会话生成唯一标识符,并将该标识符保存到数据库中。 我还将用户的ID添加到auth票证的UserData部分以进行可靠查找。 默认情况下,auth票证仅包含其用户名。 然后,在用户成功登录后,FormsAuthenticationTicket将存储在cookie中。

基本上所有这些都取代了FormsService.SignIn(model.UserName,model.RememberMe);

我还在Global.asax中添加了public void Application_ReleaseRequestState(object sender,EventArgs args)。 我不确定这是否被视为扩展function或什么,因为它似乎不是一个覆盖。 在Application_ReleaseRequestState内部,它从cookie获取用户的FormsAuthenticationTicket。 然后它解密auth票证,并从票证的UserData部分获取用户的UserID。 然后它会询问数据库auth票证是否仍然有效。 如果故障单无效,则会将用户的cookie设置为过期。

要强制用户注销,我可以在数据库中更改其身份validation票证到期日期,也可以在数据库中切换其身份validation票证的禁用位。 无论哪种方式,当Application_ReleaseRequestState询问数据库时,如果他们的身份validation票证有效,他们就不会。 因此,他们的cookie将设置为在用户在进行此检查后命中的下一页上过期。