0

我目前遇到的问题是,在 Windows Server 上更新 .Net Framework 后,IIS 为我的所有 cookie 提供了sameSite=lax属性( https://support.microsoft.com/en-us/help/4524419/kb4524419

问题类似于SameSite 属性如何自动添加到我的 Asp.net_SessionID cookie 中?

这破坏了大多数在具有另一个域的网页中使用的 IFrame 的功能,因为浏览器不会将 ASP.Net 会话 ID 与后续请求一起发送回服务器。

现在,虽然在上述线程中有一些建议,但它们并不适合我。这是由于 Safari 的非标准行为。MacOSX 和 iOS 12.x 上的 Safari 将相同站点属性的值“无”视为未知,因此将值设置为“严格”,这再次破坏了 Safari 用户的 IFrame 功能。

现在我想知道是否可以在 IIS web.config 中定义出站重写规则,该规则首先检查请求标头以查看客户端是否使用 Safari 浏览器。根据客户端浏览器,版本不同的重写出站规则应更改与浏览器期望相对应的 cookie。

是否可以根据请求编写带有条件的出站规则?我没有找到任何表明此作品的文档或网站...

4

1 回答 1

2

我修改了几个 SO 答案以提出这个 URL 重写,它添加SameSite=None到会话 cookie 中,并且还SameSite=None从大多数不兼容浏览器的所有cookie 中删除。这次重写的目的是保留 Chrome 80 之前的“遗留”行为。它特别涵盖了你提到的 MacOSX 和 iOS 12.x 场景上的 Safari。

我的Coder Frontline 博客中的完整文章:

<rewrite>
  <outboundRules>
    <preConditions>
      <!-- Checks User Agent to identify browsers incompatible with SameSite=None -->
      <preCondition name="IncompatibleWithSameSiteNone" logicalGrouping="MatchAny">
        <add input="{HTTP_USER_AGENT}" pattern="(CPU iPhone OS 12)|(iPad; CPU OS 12)" />
        <add input="{HTTP_USER_AGENT}" pattern="(Chrome/5)|(Chrome/6)" />
        <add input="{HTTP_USER_AGENT}" pattern="( OS X 10_14).*(Version/).*((Safari)|(KHTML, like Gecko)$)" />
      </preCondition>
    </preConditions>

    <!-- Adds or changes SameSite to None for the session cookie -->
    <!-- Note that secure header is also required by Chrome and should not be added here -->
    <rule name="SessionCookieAddNoneHeader">
      <match serverVariable="RESPONSE_Set-Cookie" pattern="((.*)(ASP.NET_SessionId)(=.*))(SameSite=.*)?" />
      <action type="Rewrite" value="{R:1}; SameSite=None" />
    </rule>

    <!-- Removes SameSite=None header from all cookies, for most incompatible browsers -->
    <rule name="CookieRemoveSameSiteNone" preCondition="IncompatibleWithSameSiteNone">
      <match serverVariable="RESPONSE_Set-Cookie" pattern="(.*)(SameSite=None)" />
      <action type="Rewrite" value="{R:1}" />
    </rule>
  </outboundRules>
</rewrite>

这应该适用于大多数 ASP .Net 和 ASP .Net Core 应用程序,尽管较新的框架具有适当的代码和配置选项,可让您控制此行为。我建议在使用上面的重写之前研究所有可用的选项。

于 2020-02-22T23:53:28.290 回答