当另一个用户更改用户名时,如何强制注销用户?

13

我在我的应用程序中使用Forms-Authentication来登录和登出用户。

一个功能是管理员可以更改其他用户的用户名。这种情况下,我需要注销用户名已更改的用户。

如果我不这样做,由于他们之前设置的cookie,他们仍然可以访问应用程序并接收错误消息(因为他们的用户名不存在,并且在某些功能部分中我使用了他们的用户名)。

如何使用Forms-Authentication强制这些用户注销?

更新:

    public override void OnActionExecuting(ActionExecutingContext filterContext)
    {
        string controller = filterContext.RouteData.Values["controller"].ToString();
        string action     = filterContext.RouteData.Values["action"].ToString(); ;
        // Below returns the previous username, which does not exist anymore in db.
        string userName = HttpContext.Current.User.Identity.Name;

        UnitOfWork unitOfWork = new UnitOfWork();

        if (!unitOfWork.UserRepository.UserExists(userName))
        {
            FormsAuthentication.SignOut();
            filterContext.HttpContext.Session.Clear();
            filterContext.HttpContext.Session.Abandon();
            // I am not using Roles.


        }
        unitOfWork.Dispose();
        base.OnActionExecuting(filterContext);

    }
在我的客户全局过滤器中,我检查用户是否存在,如果不存在,我会将他们注销。然而,它并没有起作用。所谓的“起作用”,是指他们通过身份验证并获得访问应用程序的权限。
提前感谢!
2个回答

9

以下是强制用户注销的步骤:

public void UserPasswordChangedHandler()
{
  FormsAuthentication.SignOut();
  Roles.DeleteCookie();
  Session.Clear();
}

我认为不需要一行一行的解释,这已经很清楚了。如果我有误,请让我知道。

更新

直接回答你的额外问题是,保持每个用户的布尔值跟踪,如果管理员更新了他的数据,如果是-只需将其重定向到登录页面。

请参阅以下文章以使用表单身份验证信息强制注销:

更新2

清除Cookie

希望这可以帮助你。


3
我认为这个方法会登出已登录的用户。我想登出其他被管理员修改密码的用户。我可以使用这段代码来让该用户退出登录,但是我怎么知道他们的密码被修改了呢?换句话说,这个方法应该在什么情况下被调用? - emre nevayeshirazi
很高兴我提供的代码有所帮助。为了回答你的附加问题(如何处理),请查看我的答案中的更新。 - Display Name
再次感谢。我在自定义的ActionFilterAttribute过滤器中使用了您的代码。在那里,我检查用户名是否存在,如果不存在(当我更改自己的用户名时满足此条件),我会注销用户。然而,问题仍然存在。用户的cookie仍然存在,他可以访问应用程序。有什么想法吗?我已经更新了我的问题并附上了过滤器代码。 - emre nevayeshirazi
尝试这个:this.ControllerContext.HttpContext.Response.Cookies.Clear(); - Display Name
回答中已更新2。它们全部成功删除了Cookies,没有理由你无法做到。 - Display Name
仍然无法工作,但应该可以。可能我做错了其他事情。感谢您的时间。 - emre nevayeshirazi

2

当用户需要失效时,您必须将其详细信息添加到某种内部静态列表中。

然后,在每个页面请求上(可能使用Application_BeginRequest),查看当前用户是否在该列表中,如果是,则立即调用FormsAuthentication.SignOut。

这似乎有点像一个hack,但这是我现在能想到的最好方法。

请注意,删除缺席用户的会话状态是另一个完全不同的问题。


我们做类似的事情来防止多个用户从不同的机器登录,我们为每个登录生成一个令牌(基于用户PC信息),然后检查该令牌是否相同,如果不同,我们强制注销。 - Daniel Powell

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接