如何在 ASP.NET 中将 SameSite cookie 属性减少回无?

Posted

技术标签:

【中文标题】如何在 ASP.NET 中将 SameSite cookie 属性减少回无?【英文标题】:How to reduce SameSite cookie attribute back to None in ASP.NET? 【发布时间】:2020-05-23 20:13:30 【问题描述】:

为了避免 CSRF(跨站点请求伪造),大多数浏览器(自 2019 年底以来)会自动考虑任何未明确定义 SameSite 属性的 cookie 将被视为 Lax,而不是之前的默认值 None。

最近(2020 年 2 月,自 Chrome 80 起)浏览器也忽略了定义 SameSite=None 且不安全的 cookie。

如何在我的 Web.config 中将会话 cookie 更改为自动更改为 None(以保持我的 SSO 集成正常工作)?

【问题讨论】:

***.com/a/48829569/3061212 【参考方案1】:

2020-08-03 编辑:Chrome 85 doesn't allow insecure SameSite=None cookies 我已经相应地更新了代码:1)仅在连接为 https 时才应用SameSite=None; 2) 仅当连接为 https 时才应用 Secure;; 3) 如果SameSite=None 是http 并且属性添加了samesite,则删除SameSite=None(重写规则)

原始回复

这是一个纯 web.config 解决方案:

定义会话cookie应该用SameSite=None呈现 将SameSite=None 附加到任何未明确定义 SameSite 属性的 cookie(使用适用于所有框架版本的方法,在最坏的情况下,如果某些属性不被接受,您可以将其删除) 将 Secure 属性附加到任何尚不安全的 cookie(只要它是 https 请求) 如果 SameSite=None 被以前的规则应用并且由于缺少 https 而无效,则删除它
<!-- This sets ASP.NET_SessionId cookie to SameSite=None, 
avoiding the default of current frameworks which is LAX -->
<system.web>

<!-- in newer framework versions you have to change the samesite 
level like by changing this default level -->
<!-- in old versions these attributes might not be allowed
and in case (if they don't work) just ignore/skip them -->

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

...
</system.web>
...
<system.webServer>
<rewrite>
   <outboundRules>
    <!-- for old versions the only solution is to intercept/modify cookies -->

    <!-- Add "SameSite=None" to any cookie which does NOT have it yet -->
    <!-- currently this only works for secure https cookies -->
    <rule name="Add SameSite">
     <conditions>
      <add input="RESPONSE_Set_Cookie" pattern="." />
      <add input="RESPONSE_Set_Cookie" pattern="; SameSite=None" negate="true" />
      <add input="HTTPS" pattern="on" ignoreCase="true" />
     </conditions>
     <match serverVariable="RESPONSE_Set_Cookie" pattern=".*" negate="false" />
     <action type="Rewrite" value="R:0; SameSite=None" />
    </rule>

    <!-- Add "Secure" to any cookie which does NOT have it yet, as long as it's HTTPS request or else a secure cookie would just be ignored -->
    <rule name="Add Secure">
     <conditions>
        <add input="RESPONSE_Set_Cookie" pattern="." />
        <add input="RESPONSE_Set_Cookie" pattern="; Secure" negate="true" />
        <add input="HTTPS" pattern="on" ignoreCase="true" />
     </conditions>
     <match serverVariable="RESPONSE_Set_Cookie" pattern=".*" negate="false" />
     <action type="Rewrite" value="R:0; Secure" />
    </rule>

    <!-- If samesite was set to none by cookieSameSite="None", -->
    <!-- remove it for non-https requests (currently only works for https) -->
    <rule name="No SameSite For HTTP">
     <conditions>
      <add input="HTTPS" pattern="off" ignoreCase="true" />
     </conditions>
     <match serverVariable="RESPONSE_Set_Cookie" pattern="(.*);(\s*)SameSite=None" />
     <action type="Rewrite" value="R:1" />
    </rule>


   </outboundRules>
</rewrite>
</system.webServer>

如果您不使用&lt;sessionState cookieSameSite="None" /&gt;,一些较新的 ASP.NET Framework 版本将默认呈现SameSite=Lax。如果你只是有重写规则将SameSite=None 添加到所有cookie,你将获得两次SameSite 属性,根据我的测试,它在Chrome 和Firefox 等某些浏览器中有效(将使用last 出现SameSite 属性),但不适用于 Edge(它使用属性的 first 出现)。

由于第一个标签&lt;sessionState cookieSameSite="None" /&gt; 会自动设置SameSite=None 但不会自动添加Secure 属性,因此我已将SameSite=NoneSecure 配置为独立规则。如果我将所有内容都放在一个规则中,我最终会得到重复的属性SameSite=None,这可能会破坏浏览器(如上所述,它是无效的,浏览器可能会不一致地处理这个问题)。

Secure 仅在它是 HTTPS 请求时才添加,因此如果您仍在接受 HTTP 连接,您的会话 cookie 将不会添加 Secure,这会使浏览器忽略您的 cookie(并且会话不会工作)。如果您使用负载均衡器或反向代理,则应使用HTTP_X_FORWARDED_PROTO attribute

最后,some versions of Safari 中存在一个错误,其中浏览器不理解SameSite=None 并将其视为SameSite=Strict。因此,对于那些特定版本,您可能决定不渲染 SameSite=None,尽管如果未指定默认值仍为 SameSite=Lax 级别,这可能不是您需要的(尚未找到解决方案)。

【讨论】:

应该是 而不是 我正在使用 .NET 框架 4.6.1,即使使用重写,它似乎也没有标记为安全。你有什么想法吗? @Michieru 在 localhost 中使用 http?还是使用 https 进行生产?安全应该只在 HTTPS 中工作,这就是为什么我添加了一个限制,即只有在 HTTPS=TRUE 时才添加安全。如果需要,您可以删除该规则。例如,如果您使用的是反向代理(它侦听 https,但在 http 中重定向到您的 IIS),您应该删除它。 在此处查看代理特定设置的解决方案:***.com/a/60357945/198953 为我工作,谢谢!在规则的第二部分中,添加语句不在 块内。

以上是关于如何在 ASP.NET 中将 SameSite cookie 属性减少回无?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 C# Asp.net 中将 SELECT sql 查询结果保存在数组中

如何在 asp .NET 中将记录添加到数据库中

如何在编辑模式 ASP .Net 中将日期选择器放在 Gridview 中

如何在 ASP.NET 中将业务模型与身份模型分开?

如何在 ASP.NET 中将文件路径转换为 ​​URL

如何在 ASP.NET 5 中将 Entity Framework 6 与 MySQL 一起使用?