32

最近 samesite=lax 自动添加到我的会话 cookie 中!这个属性只是添加到 sessionID: "Set-Cookie ASP.NET_SessionId=zana3mklplqwewhwvika2125; path=/; HttpOnly; **SameSite=Lax**"

我的网站托管在 IIS 8.5、Windows 2012 R2 上,没有 WAF 或 UrlRewrite,我关闭了 AntiVirus (kasper)。

但在某些客户服务器上也有同样的问题。

任何想法?

编辑: 我发现这个: https: //support.microsoft.com/en-us/help/4524419/kb4524419

现在,当 HttpCookie.SameSite 值为“无”时,ASP.NET 将发出 SameSite cookie 标头,以适应 Chrome 中即将对 SameSite cookie 处理进行的更改。作为此更改的一部分,FormsAuth 和 SessionState cookie 也将使用 SameSite = 'Lax' 而不是之前的默认值 'None' 发出,尽管这些值可以在 web.config 中覆盖。

如何在 web.config 中覆盖 SessionState 的相同站点 cookie?我添加了这一行,但它不适用于 SessionID cookie! <httpCookies sameSite="Unspecified" />

编辑:我发现这个:https ://docs.microsoft.com/en-us/dotnet/api/system.web.configuration.sessionstatesection.cookiesamesite?view=netframework-4.8#System_Web_Configuration_SessionStateSection_CookieSameSite

通过 SessionState 标签的“cookieSameSite”属性为状态服务器设置相同站点。

4

8 回答 8

24

为 sameSite=None 、 Lax 或 Strict 将这些选项添加到 web.config

<system.web>
    <httpCookies sameSite="None"/>
    <sessionState cookieSameSite="None" />
    <authentication mode="Forms">
        <forms cookieSameSite="None" />
    </authentication>
于 2019-12-20T13:02:19.423 回答
21

CookieSameSite 属性不适用于许多旧框架。如果您的环境不支持已接受的答案,请继续阅读!

我修改了几个 SO 答案以提出这个 URL 重写,它添加SameSite=None到会话 cookie 中,并且还SameSite=None从大多数不兼容浏览器的所有cookie 中删除。此重写的目的是保留 Chrome 80 之前的“遗留”行为。

我的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.*)" />
      <!-- Use this regex if your OS/framework/app adds SameSite=Lax automatically to the end of the cookie -->
      <!-- <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:50:59.373 回答
13

我不能使用重写,因为我的所有客户服务器上都没有安装 UrlRewrite。

最后,我将 cookieSameSite 添加到我的 web.config 中:

<sessionState mode="StateServer" cookieSameSite="None" sqlConnectionString="data source=(local);user id=sa;password=" cookieless="false" timeout="20" />

于 2019-12-14T07:02:04.027 回答
10

最后更新: zemien 的回答比我的更全面、更完整。因为它基于用户代理设置cookie。

我的答案:

对于 web.config 中的 ASP.NET_SessionId,您可以将 SameSite=Lax 替换为 SameSite=None,方法如下:

<rewrite>
  <outboundRules>
    <rule name="AddSameSiteCookieFlag">
      <match serverVariable="RESPONSE_Set-Cookie" pattern="((.*)(ASP.NET_SessionId)(=.*))(SameSite=Lax)" />
      <action type="Rewrite" value="{R:1};SameSite=None" />
    </rule>
  </outboundRules>
</rewrite>

更新: 为防止IOS 问题,更换

<action type="Rewrite" value="{R:1};SameSite=None" />

<action type="Rewrite" value="{R:1};" />
于 2019-12-12T08:53:33.503 回答
7

@zemien 您的解决方案正确解决了我们的谷歌浏览器问题

我们有一个集成,我们的应用程序嵌入在第三方的 iframe 中。2020 年 2 月 4 日发布的 Chrome 版本 80 阻止加载 cookie。

但是,我必须修改模式以捕获所有 cookie,添加安全标志和条件,以便不对我们的本地非 https 环境应用本地主机上的重写

<rule name="SessionCookieAddNoneHeader">
      <match serverVariable="RESPONSE_Set-Cookie" pattern="(.*)(SameSite=.*)?" />
      <conditions logicalGrouping="MatchAll" trackAllCaptures="false">
        <add input="{HTTP_HOST}" pattern="localhost" negate="true" />
      </conditions>
      <action type="Rewrite" value="{R:1}; SameSite=None; Secure" />
</rule>
于 2020-03-13T16:35:36.330 回答
5

为我工作。添加到我的 web.config 文件中:

<sessionState cookieSameSite="None"></sessionState>

升级到 .Net Framework 4.8 + 安装补丁:2019 年 12 月 .NET Framework 3.5 和 4.8 的累积更新,适用于 Windows 10 版本 1909 for x64 (KB4533002)

于 2020-03-31T15:19:51.340 回答
3

4 台带有 google chrome 的机器不能在 asp 上跨站点使用 cookie。关注 web.config 的 HJ van der Wijk 信息

<system.web>
    <httpCookies sameSite="None"/>
    <sessionState cookieSameSite="None" />
    <authentication mode="Forms">
        <forms cookieSameSite="None" />
    </authentication>

还是不行,得换

<httpCookies sameSite="None"/>

为了

<httpCookies httpOnlyCookies="true" requireSSL="true" sameSite="None"/>

一切正常。

谢谢

于 2020-08-03T22:22:42.207 回答
0

为 sameSite=None 、 Lax 或 Strict 将这些选项添加到 web.config

<system.web>
    <httpCookies sameSite="None" requireSSL="true" />
    <sessionState cookieSameSite="None" />
    <authentication mode="Forms">
        <forms cookieSameSite="None" requireSSL="true" />
    </authentication>
</system.web>

自 .Net Framework 4.7.2 起支持此功能。

sessionState cookieSameSite
上的文档 httpCookies sameSite 上的文档
SameSite=None需要Secure( requireSSL="true")。Lax不要StrictsessionState没有requireSSL并使用来自 的属性httpCookies
很好的文章,在 Google Chrome 中解释了 SameSite。Chrome 从版本 80 开始在 iframe 中阻止第三方 cookie。

于 2021-12-14T22:34:33.597 回答