如何设置 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 一起使用)。
您需要做的就是:
- 进行新的 git 提交。
- 在记事本中打开
.csproj
个文件。
- 将
<TargetFrameworkVersion>v4.5.2</TargetFrameworkVersion>
更改为<TargetFrameworkVersion>v4.7.2</TargetFrameworkVersion>
- 保存。
- 在 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")
根据 Google Chrome 的最新更新,它只允许具有属性
的跨平台 cookiesameSite=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 一起使用)。
您需要做的就是:
- 进行新的 git 提交。
- 在记事本中打开
.csproj
个文件。 - 将
<TargetFrameworkVersion>v4.5.2</TargetFrameworkVersion>
更改为<TargetFrameworkVersion>v4.7.2</TargetFrameworkVersion>
- 保存。
- 在 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")