C# 如何为.Net Framework 4.7.2早期版本(适用于4.5.2)设置cookie属性Samesite=None

C# 如何为.Net Framework 4.7.2早期版本(适用于4.5.2)设置cookie属性Samesite=None,c#,.net,google-chrome,cookies,samesite,C#,.net,Google Chrome,Cookies,Samesite,根据Google Chrome最近的更新,它只允许具有属性的跨平台cookie sameSite=None 链接: 如上图所示,Microsoft没有为低于4.7.2的版本提供此属性的内置支持 所以,在服务器端创建cookie时,我们无法设置它 是否有任何可能的方法可以创建具有SameSite属性的cookie?更新: 假设您已经安装了IIS的URL重写扩展2.0(Azure应用程序服务,nee Azure网站,已经安装了此扩展),因为该解决方案应该适用于大多数用户 然而(在我的象牙塔里,在

根据Google Chrome最近的更新,它只允许具有属性的跨平台cookie

sameSite=None

链接:

如上图所示,Microsoft没有为低于4.7.2的版本提供此属性的内置支持

所以,在服务器端创建cookie时,我们无法设置它

是否有任何可能的方法可以创建具有SameSite属性的cookie?

更新: 假设您已经安装了IIS的URL重写扩展2.0(Azure应用程序服务,nee Azure网站,已经安装了此扩展),因为该解决方案应该适用于大多数用户

然而(在我的象牙塔里,在一个巨大的自我泡沫中,处于我的特权地位),任何项目都没有理由不使用.NET Framework 4.7.2或更高版本,因为在过去5年多的时间里,.NET Framework的更新(Visual Studio 2013,以后)在很大程度上是可添加和向后兼容的因此,我强烈建议开发人员(尝试)先将其项目更新到.NET Framework 4.7.2或4.8,然后再尝试使用IIS Rewrite设置
SameSite
cookie参数等黑客操作

我原来的答覆是: 如何为.Net Framework 4.7.2早期版本(适用于4.5.2)设置cookie属性Samesite=None

简单地说:你不能

解释原因(我的重点):

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

  • 确保基于浏览器版本正确写入属性
  • 拦截并调整旧框架版本上的身份验证和会话cookie
唯一的解决方案是将项目升级到.NET Framework 4.7.2或更高版本

但好消息是,从.NETFramework4.5升级到4.7.2很容易,向后兼容性问题也很小。您甚至不必更改
web.config
文件中的任何内容(即,您仍然可以将ASP.NET WebForms 4.5与.NET Framework 4.8一起使用)

您需要做的只是:

  • 创建一个新的git提交
  • 在记事本中打开
    .csproj
    文件
  • v4.5.2
    更改为
    v4.7.2
  • 保存
  • 在Visual Studio中重新打开项目/解决方案,然后单击“重建”
  • 根据我的经验,您将遇到的唯一问题是:

    • 需要刷新/重新安装NuGet软件包,因为NuGet确实不容易处理目标框架的更改。这是很容易修复的(只需核化你的
      目录)
    • 非NuGet依赖项(如老式WinForms components,ew)具有特殊的安装步骤,由于某种原因,它们对特定的.NET Framework版本具有硬依赖性-在这种情况下,如果您的组件供应商没有更新,我会非常惊讶

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

    您可以通过使用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 Framework 4.7.2或更高版本的原因?不管怎样,生产环境现在都将运行.NET Framework 4.8-即使您的项目针对的是较旧版本的4.x。@Dai是的,我们正在将框架切换到4.7.2,但在此之前,我们希望这一切都能正常运行。好的,但是,代码的更改也需要正确,才能使Prod环境在进行此更改时正常运行?为什么要切换到.NET Framework 4.7.2而不是4.8?这个答案非常好(+1),我很惊讶Microsoft在其文章中没有提到它。这就是说,
    中的正则表达式模式可以收紧,因为不需要尾随分号,空格可以是可选的,因此此规则可能与某些传出响应不匹配。@Dai我对此url重写非常陌生,很高兴更新/改进答案。我们需要在Web.config文件中写入此内容吗@Sreenath@Ankita请注意,此解决方案要求您的web服务器安装IIS URL重写扩展。要使其适用于我,我还必须指定安全属性。我不确定这是一个什么样的答案,而这只是说更新框架,原始问题说他们不能更新。这个答案只是指向另一个答案。@Sreenath OP没有说他们“不能更新”-他们说他们目前正在更新到4.7.2,但他们正在寻找一个可以更快实现的解决方案。