SameSite 属性如何自动添加到我的 Asp.net_SessionID cookie 中?
how SameSite attribute added to my Asp.net_SessionID cookie automatically?
最近 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
ASP.NET will now emit a SameSite cookie header when HttpCookie.SameSite value is 'None' to accommodate upcoming changes to SameSite cookie handling in Chrome. As part of this change, FormsAuth and SessionState cookies will also be issued with SameSite = 'Lax' instead of the previous default of 'None', though these values can be overridden in web.config.
如何覆盖 web.config 中 SessionState 的同站点 cookie?
我添加了这一行,但它不适用于 SessionID cookie!
<httpCookies sameSite="Unspecified" />
通过 SessionState 标记的 "cookieSameSite" 属性为状态服务器设置相同站点。
最后更新时间:
比我的更全面更完整。因为它根据用户代理设置 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};" />
我不能使用重写,因为我的所有客户服务器上都没有安装 UrlRewrite。
最后我将 cookieSameSite 添加到我的 web.config:
<sessionState mode="StateServer" cookieSameSite="None" sqlConnectionString="data source=(local);user id=sa;password=" cookieless="false" timeout="20" />
为 sameSite=None、Lax 或 Strict
添加这些选项到 web.config
<system.web>
<httpCookies sameSite="None"/>
<sessionState cookieSameSite="None" />
<authentication mode="Forms">
<forms cookieSameSite="None" />
</authentication>
许多旧框架无法使用 CookieSameSite 属性。如果您的环境不支持已接受的答案,请继续阅读!
我修改了几个 SO 答案以提出这个 URL 重写,将 SameSite=None
添加到会话 cookie,并从 all 用于大多数不兼容浏览器的 cookie。此重写的目的是保留 "legacy" 之前的行为 Chrome 80.
<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 应用程序,尽管较新的框架具有适当的代码和配置选项来让您控制此行为。我建议在使用上面的重写之前研究所有可用的选项。
@zemien 您的解决方案正确解决了我们的 google chrome 问题
我们有一个集成,我们的应用程序嵌入到第三方的 iframe 中。 Chrome 2020 年 2 月 4 日发布的版本 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>
适合我。
添加到我的 web.config 文件中:
<sessionState cookieSameSite="None"></sessionState>
升级到 .Net Framework 4.8 + 安装补丁:
2019-12 .NET Framework 3.5 和 4.8 的累积更新 Windows 10 版本 1909 for x64 (KB4533002)
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"/>
一切正常。
谢谢
为 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 起支持此功能。
Docs on sessionState cookieSameSite
Docs on httpCookies sameSite
SameSite=None
需要 Secure
(requireSSL="true"
)。 Lax
和 Strict
没有。 sessionState
没有 requireSSL
并使用来自 httpCookies
.
的属性
Good article with explanation of SameSite in Google Chrome。 Chrome 自版本 80 起阻止 iframe 中的第三方 cookie。
最近 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
ASP.NET will now emit a SameSite cookie header when HttpCookie.SameSite value is 'None' to accommodate upcoming changes to SameSite cookie handling in Chrome. As part of this change, FormsAuth and SessionState cookies will also be issued with SameSite = 'Lax' instead of the previous default of 'None', though these values can be overridden in web.config.
如何覆盖 web.config 中 SessionState 的同站点 cookie?
我添加了这一行,但它不适用于 SessionID cookie!
<httpCookies sameSite="Unspecified" />
通过 SessionState 标记的 "cookieSameSite" 属性为状态服务器设置相同站点。
最后更新时间:
我的回答:
您可以将 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};" />
我不能使用重写,因为我的所有客户服务器上都没有安装 UrlRewrite。
最后我将 cookieSameSite 添加到我的 web.config:
<sessionState mode="StateServer" cookieSameSite="None" sqlConnectionString="data source=(local);user id=sa;password=" cookieless="false" timeout="20" />
为 sameSite=None、Lax 或 Strict
添加这些选项到 web.config<system.web>
<httpCookies sameSite="None"/>
<sessionState cookieSameSite="None" />
<authentication mode="Forms">
<forms cookieSameSite="None" />
</authentication>
许多旧框架无法使用 CookieSameSite 属性。如果您的环境不支持已接受的答案,请继续阅读!
我修改了几个 SO 答案以提出这个 URL 重写,将 SameSite=None
添加到会话 cookie,并从 all 用于大多数不兼容浏览器的 cookie。此重写的目的是保留 "legacy" 之前的行为 Chrome 80.
<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 应用程序,尽管较新的框架具有适当的代码和配置选项来让您控制此行为。我建议在使用上面的重写之前研究所有可用的选项。
@zemien 您的解决方案正确解决了我们的 google chrome 问题
我们有一个集成,我们的应用程序嵌入到第三方的 iframe 中。 Chrome 2020 年 2 月 4 日发布的版本 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>
适合我。 添加到我的 web.config 文件中:
<sessionState cookieSameSite="None"></sessionState>
升级到 .Net Framework 4.8 + 安装补丁: 2019-12 .NET Framework 3.5 和 4.8 的累积更新 Windows 10 版本 1909 for x64 (KB4533002)
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"/>
一切正常。
谢谢
为 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 起支持此功能。
Docs on sessionState cookieSameSite
Docs on httpCookies sameSite
SameSite=None
需要 Secure
(requireSSL="true"
)。 Lax
和 Strict
没有。 sessionState
没有 requireSSL
并使用来自 httpCookies
.
的属性
Good article with explanation of SameSite in Google Chrome。 Chrome 自版本 80 起阻止 iframe 中的第三方 cookie。