【问题标题】:Stop reusing the ASP.NET_sessionId停止重用 ASP.NET_sessionId
【发布时间】:2017-11-11 18:04:54
【问题描述】:

我在一个(尚未上线的)网站上遇到了一个奇怪的问题,我不知道问题的原因是什么。

以这个场景为例:

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

    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. 我将步骤 2 中的值粘贴到新的 userB cookie 值中
  6. 我导航到网站的另一个页面
  7. 我现在以 userA 身份登录

我现在的问题:

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

问候!

【问题讨论】:

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


    【解决方案1】:

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

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

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

    【讨论】:

    • 嗨,翁德雷!你是绝对正确的。会话与身份验证部分无关。我们目前有 https http-only cookie。不使用基于 IP 的 cookie 是一个很好的评价。唯一我仍然无法理解的是带有加密用户 ID 的票。好像只要用户登录了,ticket在timestamp的时间段内都是有效的,但是当用户退出时,我希望这个ticket失效所以你不能再使用那个ticket了?但正如你所提到的,这是不可能的,因为服务器端没有存储任何东西......
    猜你喜欢
    • 2020-04-25
    • 2016-10-05
    • 2018-08-05
    • 1970-01-01
    • 2020-12-10
    • 2011-04-12
    • 2019-12-19
    • 1970-01-01
    • 2015-05-20
    相关资源
    最近更新 更多