强制注销mvc 4应用程序中的所有设备?

时间:2014-06-13 19:00:52

标签: asp.net asp.net-mvc asp.net-mvc-4

我有mvc 4项目,默认帐户控制器和UsersContext为DbContext。当用户,假设User1使用REMEMBER ME登录时在移动设备上进行了检查。第二天User1登录笔记本电脑并更改了密码,现在User1打开了他的手机,即使更改了密码,它也已登录。

有什么方法可以强制User1注销所有设备, 没有在数据库中存储任何会话ID?

3 个答案:

答案 0 :(得分:1)

我想你可以存储一个"最后一次密码更改日期"在cookie中。在身份验证时,如果用户自存储日期以来更改了密码,则不要对用户进行身份验证。

您应该存储上次密码更改日期的哈希值,以免从客户端篡改。

答案 1 :(得分:0)

在数据库中有一个标志,用于检查Session_Start上的用户,如果设置了该标志,则会使其会话无效。可能不一定使用布尔值,您可以使用DateTime值并使之前开始的所有会话无效。这可以通过在登录时检查存储在cookie中的值来完成。

ASP.NET MVC(我知道)内置了提供此功能的内容

答案 2 :(得分:0)

我知道这是一个古老的话题,但今天我遇到了这个问题。原因略有不同,但我需要做同样的事情 - 如果记住我,请注销用户'被选中了。

我的案例中的原因是数据库的更改。我在连接字符串中更改了数据库名称(从“测试数据库”到“数据库”),我仍然会在运行项目后登录,这会导致问题,因为用户实际上并不存在于这个新数据库中。

所以在Global.asax中我做了以下事情:

    private ApplicationUserManager _userManager;

    public ApplicationUserManager UserManager
    {
        get
        {
            return _userManager ?? HttpContext.Current.GetOwinContext().GetUserManager<ApplicationUserManager>();
        }
        private set
        {
            _userManager = value;
        }
    }

    protected void Session_Start()
    {
        if (User.Identity.IsAuthenticated)
        {
            var user = UserManager.FindByName(User.Identity.Name);
            if (user == null)
            {
                HttpContext.Current.GetOwinContext().Authentication.SignOut(DefaultAuthenticationTypes.ApplicationCookie);
                Response.Redirect("/", true);
            }
        }
    }

您需要重定向并终止当前页面的执行(通过传递true),因为(据我所知),注销不会影响当前请求,因此正在加载的页面仍然会像用户一样加载登录。任何人都可以随意纠正,澄清或扩展此事。