【问题标题】:how SameSite attribute added to my Asp.net_SessionID cookie automatically?SameSite 属性如何自动添加到我的 Asp.net_SessionID cookie 中?
【发布时间】:2019-11-30 15:02:11
【问题描述】:

最近 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”属性为状态服务器设置samesite。

【问题讨论】:

  • 你通过添加“
  • 我在 iis 中收到了相同的消息,但它可以工作并在 set-cookie 时间更改相同的站点值。我将 cookieSameSite="None" 添加到我的 web.config 以获取 previuse 行为。注意 cookieSameSite 是 caseSesitive。
  • 我只需要为此修补一个 4.5.2 旧版站点 - 配置不支持 SameSite,因此我必须拦截 Session_Start 上的 cookie 并直接使用 "SameSite=None; Secure " 补充道。
  • @ParanoidCoder 为您提供建议,我使用 .net 4.6.1,它适用于我。但是我对您的解决方案有疑问:您使用 URL 重写(IIS 的扩展)或者您通过 Session_Start 中的代码重写它,您能告诉我您的代码吗?
  • @ParanoidCoder 是的,你能分享一下 Session_Start 代码吗?

标签: asp.net iis samesite


【解决方案1】:

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

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

【讨论】:

  • &lt;httpCookies sameSite 在 .Net Framework 4.8 上未显示为有效选项
  • @AnkushJain,不,从 .Net Framework 4.7.2 开始支持。
  • 如果您希望它在 sessionState 中工作,请确保您在 both compilationhttpRuntime 中设置了 targetFramework 属性:&lt;system.web&gt;&lt;compilation targetFramework="4.7.2"/&gt;&lt;httpRuntime targetFramework="4.7.2"/&gt;&lt;/system.web&gt; .
  • 我的一个网站确实是旧的 .net 3.5。当我在上面添加时,网站就会中断。我们可以改用 .htaccess 文件或 httpd.ini 吗?让我知道。谢谢
  • @IronSean 那是 VS 抱怨。那只是 MS 没有更新他们的工具。该设置确实有效。
【解决方案2】:

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

我修改了几个 SO 答案以提出这个 URL 重写,将 SameSite=None 添加到会话 cookie,并从大多数不兼容浏览器的 所有 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 应用程序,尽管较新的框架具有适当的代码和配置选项,可让您控制此行为。我建议在使用上面的重写之前研究所有可用的选项。

【讨论】:

  • 你把它放在 MVC 5 的什么地方?在&lt;system.net&gt;&lt;/system.net&gt;?
  • &lt;system.webServer&gt;
  • 注意:如果 ASP.NET_SessionId-cookie 已经有 SameSite=Lax 这将只附加 SameSite=None 而不会替换它。
  • @zemien 我不明白为什么在模式中有(SameSite=.*)?
  • @cederlof 你是对的!我没有正确测试我的正则表达式,因为我的环境是较旧的 .Net 框架,没有自动添加 Lax 属性。在您的情况下,您可以使用不同的正则表达式来排除 SameSite=Lax 标头:((.*)(ASP.NET_SessionId)(=.*))(?=SameSite) 请参阅更新的 regex101.com/r/7D9UdO/3 - 但是请注意,此正则表达式将排除您之后可能想要的任何内容,例如安全标头。这应该是一种罕见的情况,因此关键是查看您的操作系统+框架+应用程序正在发出什么并编写适合的正则表达式。我将更新我的答案以反映两种方式:)
【解决方案3】:

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

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

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

【讨论】:

  • 很抱歉@Sadegh.K,但它在 4.7.2 之前无法正常工作,如下所述:docs.microsoft.com/en-us/aspnet/samesite/…
  • @Sadegh 是的,但这不会将cookieSameSite 功能添加到 web.config - .NET 4.7.2 会。我在评论中发布的链接也链接到您引用的页面。
  • @cederlof 我同意你的看法,但在这次更新之后,我将此配置添加到我的 web.config 中,它对我有用,并且我的站点请求中设置了 samesite="none"。跨度>
  • @Sadegh 如何设置站点支持 Net 4.7.2 ?
【解决方案4】:

最后更新: zemien's answer 比我的更全面更完整。因为它根据用户代理设置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 problem,替换

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

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

【讨论】:

  • 只有在服务器上安装了IIS重写模块才能实现
  • 您的 iOS 更新问题也会在较新的操作系统中引起问题。基本上,如果缺少 SameSite 标头,某些浏览器/操作系统将分配 SameSite=Lax。我相信唯一的方法是进行 UserAgent 嗅探并决定是否包含标头。我仍在研究这是否可以通过 web.config 完成,或者必须在 Session_Start 中包含代码更改。
  • 只是为了突出 @zemien 所写的内容,您的 iOS 更新修复了一个问题,但引入了另一个问题。
  • 为什么设置为 None 而不是 strict?
  • @VincentDucroquet 你知道我们安装“IIS重写模块”的收费吗?提前致谢!
【解决方案5】:

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

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

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

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

【讨论】:

  • 这个“几乎”对我有用,我不得不替换 pattern="(.*)(SameSite=.*)?" zemien 的回答中带有 pattern="(.*ASP.NET_SessionId.*)" 的部分。非常感谢!
【解决方案6】:

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

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

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

【讨论】:

    【解决方案7】:

    4 台带有 google chrome 的机器无法在 asp 上跨站点使用 cookie。 关注 web.config 的 H. J. 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"/>
    

    一切正常。

    谢谢

    【讨论】:

      【解决方案8】:

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

      <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 起支持此功能。

      Docs on sessionState cookieSameSite
      Docs on httpCookies sameSite
      SameSite=None 需要 Secure (requireSSL="true")。 LaxStrict 不要。 sessionState 没有 requireSSL 并使用来自 httpCookies 的属性。
      Good article with explanation of SameSite in Google Chrome。 Chrome 从 80 版开始在 iframe 中阻止第三方 cookie。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2020-03-31
        • 2020-12-15
        • 1970-01-01
        • 1970-01-01
        • 2020-04-17
        • 2020-07-04
        • 2020-07-13
        • 2020-12-13
        相关资源
        最近更新 更多