我正在使用隶属于MVC2默认项目的MembershipProvider。
我希望能够获取用户名列表,并关闭用户,并在需要时销毁他们的会话。我似乎最接近的是:
foreach(string userName in UserNames)
{
MembershipProvider MembershipProvider = new MembershipProvider();
MembershipUser membershipUser = MembershipProvider.GetUser(userName, true);
Session.Abandon();
FormsAuthentication.SignOut();
}
我想我需要使用与我想要注销的用户相关的会话和/或注销方法,但我不确定它们会在哪里。
这样做的正确方法是什么?
答案 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将被设置为在用户在进行此检查后点击的下一页上过期。