停止重用ASP.NET_sessionId

时间:2017-06-09 16:22:42

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

我的网站有一个奇怪的问题,我不知道问题的原因是什么。

采取这种情况:

  1. 我使用userA登录网站。
  2. 我打开F12并复制ASP.NET_SessionId和.AspNet.ApplicationCookie的cookie值
  3. UserA注销。执行此代码块:

    HttpContext.GetOwinContext().Authentication.SignOut();
    
    Session.Clear();
    Session.Abandon();
    Session.RemoveAll();
    
    Request.Cookies["ASP.NET_SessionId"].Expires = DateTime.UtcNow.AddDays(-1d);
    Response.Cookies["ASP.NET_SessionId"].Value = "";
    Response.Cookies.Add(Request.Cookies["ASP.NET_SessionId"]);
    
    return Redirect($"{AppSettings.PublicLandingPage}/loggedout");
    
  4. UserB登录。

  5. 我将step2中的值粘贴到新的userB cookie值
  6. 我导航到网站的其他页面
  7. 我现在以userA
  8. 身份登录

    我现在的问题:

    • 这是预期的行为吗?如果没有,这个问题的原因是什么?
    • 有没有办法杀死服务器端的会话?在我的web.config中,会话超时设置为10分钟,并且站点成功注销,但是当与任何用户重新登录并复制“旧”cookie数据时,即使在48小时后,会话似乎仍然存在。 / LI>
    • 我还没有尝试过,但是如果我在另一个IP地址上执行这些步骤,我可以期待相同的行为吗?有办法阻止这个吗?

    问候!

1 个答案:

答案 0 :(得分:3)

您将身份验证与会话混合在一​​起 - 这些是单独的概念 - 您可以在没有经过身份验证的情况下拥有活动会话,也可以在没有活动会话的情况下进行身份验证。

至于为什么要进行身份验证 - 这是设计使然。身份验证cookie包含所谓的票证 - 通常它由加密的UserID,Timestamp(在时间戳到期后cookie无用)和其他一些信息组成。服务器内存中没有任何内容 - 因此您可以拥有负载平衡器/ Web服务器场,并且可以无缝地对用户进行身份验证。 Cookie(基于加密时间戳)可以使用绝对过期或滑动过期。如果使用滑动过期服务器(一旦浏览器发送请求和滑动过期时间的一半已经过去)用新的时间戳替换auth cookie。

如果你担心cookie被盗 - 请先检查你是否使用https和http-only cookies :)如果你需要加强安全性,请注意基于IP的cookie保护会导致可用性问题 - 比如当您使用笔记本电脑/手机从一个wifi移动到另一个wifi时 - 您已经注销,还有其他可以用作浏览器指纹的东西 - 比如用户代理字符串等。