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

时间:2011-01-05 01:33:22

标签: c# asp.net-mvc-2 membership-provider

我正在使用隶属于MVC2默认项目的MembershipProvider。

我希望能够获取用户名列表,并关闭用户,并在需要时销毁他们的会话。我似乎最接近的是:

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

我想我需要使用与我想要注销的用户相关的会话和/或注销方法,但我不确定它们会在哪里。

这样做的正确方法是什么?

3 个答案:

答案 0 :(得分: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();
                    }
            }       
    }

答案 1 :(得分:1)

当我这样做时,我没有使用会员提供商,但基本上我在用户登录时保存了数据库中访问的SessionId,Username和lastPage。然后,每个页面使用当前的SessionID来获取用户名并执行相关的用户名内容,例如当前用户的显示余额等。如果没有有效的会话用户,则返回登录页面。

这让我可以看到用户在网站上的进展情况,并手动断开我想要的任何人,并为每个用户提供单点登录。 global.asx页面中还有一堆清理代码

答案 2 :(得分:0)

事实证明,这与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将被设置为在用户在进行此检查后点击的下一页上过期。