【问题标题】:How do I invalidate a session in MVC5 identity?如何使 MVC5 身份中的会话无效?
【发布时间】:2019-03-22 05:29:20
【问题描述】:

如何使会话无效?
再现:

  1. 使用普通帐号登录
  2. 导出与我的网站关联的 cookie
  3. 点击退出按钮
  4. 确认我已退出网站,cookie 已清除
  5. 导入从第 2 步复制的 cookie
  6. 我现在无需通过登录过程即可再次登录该站点

有没有办法让之前复制的cookies失效?

我正在使用标准的 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();

【问题讨论】:

标签: asp.net-mvc-5


【解决方案1】:

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

如果您有一个包含 KeyId 和 IsValid 列的类似会话表,并覆盖 AuthorizeAttribute.AuthorizeCore。您可以检查数据库中的 IsValid 列与依赖 cookie。

我希望这能给你一个想法。

【讨论】:

    【解决方案2】:

    我不知道如何使 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
         }
    }
    

    【讨论】:

      猜你喜欢
      • 2016-03-05
      • 2016-01-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-08-30
      • 1970-01-01
      相关资源
      最近更新 更多