如何为4.7.2(对于4.5.2)的.Net Framework设置cookie属性Samesite = None

时间:2020-09-08 12:21:02

标签: c# .net google-chrome cookies samesite

根据Google Chrome的最新更新,它仅允许具有属性的跨平台Cookie

sameSite=None

enter image description here

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

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

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

我们可以使用SameSite属性创建cookie吗?

2 个答案:

答案 0 :(得分:6)

更新:

假设您已经安装了IIS的URL Rewrite Extension 2.0(Azure App Services, nee Azure网站,已经安装了此服务)then you should look at @sreenath's answer,因为该解决方案应该适合大多数用户。

但是(在我的象牙塔中位于巨大的自我泡沫中的特权位置)中没有任何理由不使用.NET Framework 4.7.2的任何项目或更高版本,因为过去5年以上的.NET Framework更新(从Visual Studio 2013开始)在很大程度上是可加和向后兼容的。 因此,我强烈敦促开发人员首先(尝试)将其项目更新到.NET Framework 4.7.2或4.8 ,然后再尝试使用IIS Rewrite设置SameSite cookie参数之类的黑客手段。 >

我的原始答案:

如何为4.7.2(对于4.5.2)的.Net Framework设置cookie属性Samesite = None

简单地说:不能。

The article you linked to解释了为什么(强调我的意思):

Microsoft不支持低于4.7.2的.NET版本来写入同站点cookie属性。我们没有找到了一种可靠的方法:

  • 确保根据浏览器版本正确编写属性。
  • 在较早的框架版本上拦截并调整身份验证和会话cookie

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

但是,好消息是,从.NET Framework 4.5升级到4.7.2非常容易,并且存在最小的向后兼容性问题(如果有的话)。您甚至不必更改web.config文件中的任何内容(即您仍然可以将ASP.NET WebForms 4.5与.NET Framework 4.8结合使用)。

您需要做的是:

  1. 进行新的git commit。
  2. 在记事本中打开您的.csproj文件。
  3. <TargetFrameworkVersion>v4.5.2</TargetFrameworkVersion>更改为<TargetFrameworkVersion>v4.7.2</TargetFrameworkVersion>
  4. 保存。
  5. 在Visual Studio中重新打开项目/解决方案,然后单击“重建”。

根据我的经验,您遇到的唯一问题是:

  • 需要刷新/重新安装NuGet软件包,因为NuGet确实不能轻松处理目标框架更改。修复起来很简单(只需按一下packages目录即可。)
  • 非NuGet依赖项(例如老式的WinForms组件,ew)具有特殊的安装步骤,由于某些原因,它们对特定的.NET Framework版本有严格的依赖关系-在这种情况下,如果您的组件很令我感到惊讶供应商没有更新。

当然,我仍然会责骂您产品的经理,因为他们不能确保他们的项目在七年 中保持正常运行(如.NET Framework 4.5。 2已于2013年发布)。为什么没有CI管道设置来自动处理此问题?

答案 1 :(得分:2)

您可以通过使用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>