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


20

最近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覆盖samesite cookie?我添加了这一行,但不适用于SessionID cookie! <httpCookies sameSite="Unspecified" />

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

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


你有没有得到它解决了加入“<SessionState的CookieSameSite“我已经安装了4.8,但是当我访问IIS管理SessionState的部分我刚收到无法识别的属性?。
Jokies鼎

1
我在iis中收到了相同的消息,但它起作用并在set-cookie时间中更改了samesite的值。我将cookieSameSite =“ None”添加到我的web.config中,以获取之前的行为。注意cookieSameSite是caseSesitive。
萨德,

我只需要为此修补4.5.2旧站点-配置不支持SameSite,因此我不得不在Session_Start上拦截cookie,并直接添加“ SameSite = None; Secure”将其重写。
ParanoidCoder

@ParanoidCoder坦克你的建议,我使用.net 4.6.1,它为我工作。但是我对您的解决方案有一个疑问:您使用URL重写(IIS的扩展名)还是通过Session_Start中的代码重写了它,您可以告诉我您的代码吗?
萨迪

Answers:


19

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

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

1
<httpCookies sameSite在.Net Framework 4.8上未显示为有效选项
IronSean

它适用于4.6.1框架吗?
Ankush Jain

@AnkushJain,不,自.Net Framework 4.7.2开始受支持。
Vasiliy Zverev

11

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

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

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


2
它仅适用于.net 4.7.2之后
mrlayeghi

1
我在.net 4.6.1中使用它,它工作正常。
萨德

对不起@ Sadegh.K,但它并不像这里所说4.7.2之前的工作:docs.microsoft.com/en-us/aspnet/samesite/...
cederlof

@cederlof我发现了这个问题:support.microsoft.com/en-us/help/4533011/kb4533011
Sadegh

@Sadegh是的,但这并未将cookieSameSite功能添加到web.config-.NET 4.7.2可以。我在评论中发布的链接也从您引用的页面链接到。
cederlof

8

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

我对几个SO答案进行了修改,以提出此​​URL重写,该URL重写会添加SameSite=None到会话Cookie中,并且还会SameSite=None所有 URL中删除不兼容的浏览器的 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>

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


您在MVC 5中将其放在哪里?在<system.net></system.net>
Joel Wiklund

<system.webServer>
泽米恩

注意:如果ASP.NET_SessionId-cookie已经具有,SameSite=Lax它将仅追加SameSite=None而不替换它。
cederlof

@zemien我不明白为什么(SameSite=.*)?在模式中根本没有?
cederlof

1
@cederlof你是对的!我没有正确测试我的正则表达式,因为我的环境是较旧的.Net框架,无法自动添加Lax属性。在您的情况下,可以使用其他正则表达式来排除SameSite=Lax标头:((.*)(ASP.NET_SessionId)(=.*))(?=SameSite)请参阅更新的regex101.com/r/7D9UdO/3-但是请注意,此正则表达式将排除以后可能需要的所有内容,例如安全标头。这应该是一种罕见的情况,因此关键是要查看您的OS + framework + app发出了什么并编写适合的正则表达式。我将更新我的答案以反映两种方式:)
zemien

7

最后更新: 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};" />

2
仅当服务器上安装了IIS重写模块时才有可能
Vincent Ducroquet

1
您针对iOS问题的更新也会在较新的操作系统中引起问题。基本上来说,某些浏览器/ OS如果缺少SameSite标头,则会分配SameSite = Lax。我相信唯一的方法是进行UserAgent嗅探并决定是否包含标头。我仍在研究是否可以通过web.config完成此操作,或者它必须在Session_Start中包含代码更改。
zemien

只是为了强调@zemien写的内容,您的iOS更新解决了一个问题,但引入了另一个问题。
cederlof

3

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

1

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

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

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

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.