如何使MVC5身份中的会话无效?

时间:2014-03-02 04:50:43

标签: asp.net-mvc-5

如何使会话无效?
REPRO:

  1. 使用普通帐户登录
  2. 导出与我的网站相关联的Cookie
  3. 点击退出按钮
  4. 确认我已退出网站,Cookie已清除
  5. 导入从步骤2复制的Cookie
  6. 我现在再次登录该网站而无需完成登录过程
  7. 无论如何,以前复制的cookie都无效吗?

    我正在使用标准的MVC5注销功能。

        public ActionResult LogOff()
        {
            AuthenticationManager.SignOut();
            return RedirectToAction("Index", "Home");
        }
    
    
        private IAuthenticationManager AuthenticationManager
        {
            get
            {
                return HttpContext.GetOwinContext().Authentication;
            }
        }
    

    还尝试退出cookie。

    AuthenticationManager.SignOut(DefaultAuthenticationTypes.ApplicationCookie);
    

    更改SecurityStamp的想法也可行,但由于索赔没有改变,邮票也没有。

    UserManager.UpdateSecurityStampAsync(user.UserName);
    

    我也尝试过这个函数,文档说这应该使会话无效。 http://msdn.microsoft.com/en-us/library/system.web.sessionstate.httpsessionstate.abandon(v=vs.110).aspx

    Session.Abandon();
    

2 个答案:

答案 0 :(得分:0)

我不知道您描述的cookie问题,但是我需要让用户通过桌面应用程序使会话无效。因此,桌面上的用户可以将某人踢出该Web应用程序。我是通过在他们登录时创建一个GUID并将GUID存储在我的数据库和cookie中来实现的。然后,我重写AuthorizeAttribute.AuthorizeCore来检查数据库上的GUID仍然有效。我的GUID表中有一列IsValid,当他们注销或桌面上有人将其退出时,我将IsValid更改为false。

如果您有一个具有KeyId和IsValid列的类似会话表,请覆盖AuthorizeAttribute.AuthorizeCore。您可以检查数据库中的IsValid列是否依赖于Cookie。

我希望能给您一个想法。

答案 1 :(得分:-1)

我不知道如何“使cookie”本身“无效”,但如果您需要的是使重用cookie的请求无效,那么您可以跟踪会话的状态,并在请求后检查此状态认证

用于跟踪会话:

public async Task<ActionResult> Login(LoginViewModel model, string returnUrl)
{
     ...
     await SignInAsync(user, model.RememberMe);
     Session["IsValid"] = true;         // Tells that the session is valid 
     ...
}

public ActionResult LogOff()
{          
     AuthenticationManager.SignOut();
     Session["IsValid"] = false;       // The session is no longer valid
     ...
}

在Global.asax

protected void Session_End(Object sender, EventArgs e)
{
     Session["IsValid"] = false;      // Invalidate the session here too
}


protected void Application_AcquireRequestState(Object sender, EventArgs e)
{
     if (Request.IsAuthenticated &&                          // The cookie tells that the request is authenticated...
        !(bool) HttpContext.Current.Session["IsValid"])      // but the session status is NOT valid
     {
           // Handle requests that re-use the auth cookie
     }
}