ASP.NET webform 在从另一个域获取发布数据时丢失会话

ASP.NET webform loses session when getting posted data from another domain

简单:

  1. 在网站中 用户登录并创建一些会话对象。

  2. 网站 A 使用 Response.Redirect 将用户重定向到网站 B 中的页面。

  3. 网站 B 使用提交按钮将表单集合发布到网站 A 的页面。

  4. 在这个特定点上,这个特定用户的所有会话都丢失并且 Session_Start 再次触发。

本地主机域和生产域都一样。

当两个页面都在同一个域时,这没问题,但两个单独的域就会出现问题。

在第 3 步中,当使用 link 而不是 return 按钮访问网站 A(显然是 wieemsh 完全合格的域名)时,一切正常并且存在会话。

这似乎是一个跨平台问题 submit/POST。

会话是带有 cookie 的 InProc,无法更改此设置。

感谢您的关注。

P.S。谷歌搜索这个,我发现从一个页面重定向到另一个页面时存在某种类似的 'losing session' 问题。这不是由 response.Redirect.

引起的

编辑

这个问题有可能是SameSite Cookie Policy引起的。我 运行 在几个条件下进行了几次测试,但我仍然无法确认这一点。

首先这是一个 4.7.1 ASP.NET webform 项目,所以如果您使用 MVC,您只能得到一些线索。

正如@JohnPete22 提到的那样 This Article 说 SameSite Cookie 政策(作为一项新的安全措施)适用于 4.7.2 及更高版本,您至少可以在其中控制打开或关闭它,但是它没有说的是它也会影响 4.7.1 项目以及无法控制该功能,准确地说,它始终处于打开状态,但 .NET 框架版本无法识别控制命令(我不知道任何 .NET 更新来解决这个问题)。这就是为什么回发到单独域上的页面会丢失表单收集数据的原因:维护跨域安全。

注意:这不是解决方案,而是解决方法:

  1. 将您的项目更新到 4.7.2 以启用 SameSite 模式,这不是什么大问题。

  2. 将此代码添加到 Global.asax Session_Start 事件

    if (Response.Cookies["ASP.NET_SessionId"] != null)
    {
        Response.Cookies["ASP.NET_SessionId"].SameSite = SameSiteMode.None;
    
        // Optional - This makes the feature secure
        // if (Request.IsSecureConnection)
        //      Response.Cookies["ASP.NET_SessionId"].Secure = true;
    }
    

    我测试了其他选项 SameSiteMode.StrictSameSiteMode.Lax 但没有用,所以我干脆关闭了该功能。

  3. 将此添加到 Web.Config System.Web 部分:

    <sessionState mode="InProc" cookieless="UseCookies" />
    
  4. 为了加强安全性,您可以考虑使用 Request.UrlReferrer?.ToString() 检查源网站并相应地更改 SameSite 模式。

就这些了,伙计们!