如何设置 Cookie 属性 Samesite = None for .Net Framework earlier of 4.7.2 (for 4.5.2)

How to set cookie attribute Samesite = None for .Net Framework earlier of 4.7.2 (for 4.5.2)

根据 Google Chrome 的最新更新,它只允许具有属性

的跨平台 cookie
sameSite=None

Link: https://docs.microsoft.com/en-us/aspnet/samesite/system-web-samesite#net-versions-earlier-than-472

根据上图,Microsoft 不为低于 4.7.2 的版本提供对此属性的内置支持。

因此,我们无法在服务器端创建 cookie 时设置它。

有什么方法可以创建具有 SameSite 属性的 cookie?

更新:

假设您安装了 IIS 的 URL Rewrite Extension 2.0(Azure App Services,nee Azure Websites,已经安装了)解决方案应该适用于大多数用户。

但是(在我的象牙塔内,在一个巨大的自负泡沫中,我处于特权地位)任何项目都没有任何借口不已经在使用 .NET Framework 4.7.2 或更高版本,因为 .NET Framework 在过去 5 年多(Visual Studio 2013 年起)的更新在很大程度上是附加的 backwards-compatible。 因此,我强烈建议开发人员(尝试)先将他们的项目更新到 .NET Framework 4.7.2 或 4.8,然后再尝试使用 IIS Rewrite 设置 SameSite cookie 参数等技巧.

我原来的回答:

How to set cookie attribute Samesite = None for .Net Framework earlier of 4.7.2 (for 4.5.2)

简单地说:你不能。

The article you linked to 解释原因(强调我的):

Microsoft does not support .NET versions lower that 4.7.2 for writing the same-site cookie attribute. We have not found a reliable way to:

  • Ensure the attribute is written correctly based on browser version.
  • Intercept and adjust authentication and session cookies on older framework versions

唯一的解决办法是将项目升级到 .NET Framework 4.7.2 或更高版本。

但好消息是,从 .NET Framework 4.5 升级到 4.7.2 很容易,backwards-compatibility 问题很少(如果有的话)。您甚至不必更改 web.config 文件中的任何内容(即您仍然可以将 ASP.NET WebForms 4.5 与 .NET Framework 4.8 一起使用)。

您需要做的就是:

  1. 进行新的 git 提交。
  2. 在记事本中打开 .csproj 个文件。
  3. <TargetFrameworkVersion>v4.5.2</TargetFrameworkVersion>更改为<TargetFrameworkVersion>v4.7.2</TargetFrameworkVersion>
  4. 保存。
  5. 在 Visual Studio 中重新打开 projects/solutions 并单击重建。

根据我的经验,您 run-into 唯一的问题是:

  • 需要 refresh/reinstall NuGet 包,因为 NuGet 确实无法轻松处理 target-framework 更改。这很容易修复(只需核对您的 packages 目录)。
  • Non-NuGet 依赖项(如 old-school WinForms 组件,ew)具有特殊安装步骤,由于某种原因对特定 .NET Framework 版本具有硬依赖性 - 在这种情况下,我将如果您的组件供应商没有更新,请感到非常惊讶。

当然,我仍然会责备你们的产品经理没有确保他们的项目在working-order中保持七年(因为 .NET Framework 4.5.2 于 2013 年发布)。为什么没有 CI 管道 set-up 来自动处理这个问题?

您可以通过使用 IIS URL 重写模块来实现。这将需要您在服务器本身上安装模块,但这将为您提供我希望的解决方案。

<rewrite>
      <outboundRules>
        <clear />
        <rule name="Add SameSite" preCondition="No SameSite">
          <match serverVariable="RESPONSE_Set_Cookie" pattern=".*" negate="false" />
 
          <action type="Rewrite" value="{R:0}; SameSite=none;" />
          <conditions>
          </conditions>
        </rule>
        <preConditions>
          <preCondition name="No SameSite">
            <add input="{RESPONSE_Set_Cookie}" pattern="." />
            <add input="{RESPONSE_Set_Cookie}" pattern="; SameSite=none;" negate="true" />
          </preCondition>
        </preConditions>
      </outboundRules>
    </rewrite>

对于较早的 .NET 版本,实现此目的的最简单方法是直接创建 header: Response.Headers.Add("set-cookie", "mysessioncookie=theValue; path=/; SameSite=Strict")