如何将SameSite属性自动添加到我的Asp.net_SessionID cookie中?

时间:2019-11-30 15:02:11

标签: asp.net iis samesite

最近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值设置为“ None”时,ASP.NET现在将发出SameSite cookie标头,以适应即将在Chrome中对SameSite cookie处理进行的更改。作为此更改的一部分,尽管可以在web.config中覆盖这些值,但FormsAuth和SessionState cookie也将以SameSite ='Lax'发出,而不是以前的默认值'None'。

如何在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”属性为状态服务器设置相同站点。

7 个答案:

答案 0 :(得分:19)

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

我对几个SO答案进行了修改,以提供此URL重写,该URL重写为会话cookie添加了SameSite=None,并且对于大多数不兼容的浏览器,还从 all cookie中删除了SameSite=None。重写的目的是保留Chrome 80之前的“旧版”行为。

我的Coder Frontline blog中的全部文章:

<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应用程序,尽管较新的Frameworks具有适当的代码和配置选项可让您控制此行为。我建议您在使用上面的重写之前,先研究所有可用的选项。

答案 1 :(得分:6)

@zemien您的解决方案正确解决了我们的Google chrome问题

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

但是我必须修改模式以捕获所有cookie,添加Secure标志,并且要不对本地的非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>

答案 2 :(得分:4)

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

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

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

答案 3 :(得分:2)

我无法使用重写,因为未在所有客户服务器上安装UrlRewrite。

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

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

答案 4 :(得分:2)

将这些选项添加到web.config中,以确保sameSite = None,Lax或Strict

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

答案 5 :(得分:1)

对于web.config中的ASP.NET_SessionId,可以使用SameSite = None将SameSite = Lax替换为:

<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>

答案 6 :(得分:1)

4台带有谷歌浏览器的计算机无法在ASP上的网站上使用Cookie。 Folow H. J. van der Wijk的web.config信息

<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"/>

一切正常。

谢谢