ASP.NET MVC 3 身份验证 cookie 不适用于 iFrame
ASP.NET MVC 3 Authentication cookies not working on iFrame
我们正在分发 ASP.NET MVC 3.0 应用程序(C# 和 .NET 4.0),一些客户使用 iframe 进行某些自定义,但现在它已停止工作。我认为这与我们所做的一些安全更改有关:
将“Content-Security-Policy”设置为“frame-ancestors 'self'”
强制 cookie 属性(在 global.asax.cs 中,因为在 4.0 中没有任何其他方法可以设置相同的站点 属性):
- SameSite:严格
- 安全:正确
- HttpOnly: 真
并且在删除“Content-Security-Policy”和 cookie 重写规则后它已经起作用了。但是,当我尝试验证 (user/password) 时,验证 cookie 没有发送,我无法重写它们,因为它们没有随请求一起提供。
我在网络 request/response 的 Cookie 选项卡上看到以下消息:
“通过 Set-Cookie header 设置 cookie 的尝试被阻止,因为它具有“SameSite=Lax”属性,但来自 cross-site 响应,而不是对 top-level 导航".
我读到它与“最近的”浏览器安全更新有关 and/or Windows/ASP.NET 安全补丁,但经过一些研究后,没有任何解决方案适合我...
我找到了解决方案:
升级到 .NET Framework 4.7.2:好的,我正在使用 4.0,我计划今年升级到 4.8。我已经在一个分支上进行了测试,并更改了该框架的一些新 cookie 属性,它起作用了。
但是我有一个客户在我们的网站上使用 iframe,迁移到 4.8 既不容易又不快,所以我找到了 URL 重写IIS模块。我已经包含了一个内容安全策略规则来添加我的(他们的)iFrame 页面主机。我点击了这些链接:
我为该客户提供的最新版本 web.config:
<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">
<!-- 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; Secure=true" />
</rule>
<!-- 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="FormsCookieAddNoneHeader">
<!-- Use this regex if your OS/framework/app adds SameSite=Lax automatically to the end of the cookie -->
<match serverVariable="RESPONSE_Set-Cookie" pattern="((.*)(ASPXFORMSAUTH[^=]*)(=.*))(?=SameSite)" />
<action type="Rewrite" value="{R:1}; SameSite=None; Secure=true" />
</rule>
<rule name="RewriteContentSecurityPolicy">
<match serverVariable="RESPONSE_Content-Security-Policy" pattern="(.*)" />
<action type="Rewrite" value="{R:0} iframehost" />
</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 MVC 3.0 应用程序(C# 和 .NET 4.0),一些客户使用 iframe 进行某些自定义,但现在它已停止工作。我认为这与我们所做的一些安全更改有关:
将“Content-Security-Policy”设置为“frame-ancestors 'self'”
强制 cookie 属性(在 global.asax.cs 中,因为在 4.0 中没有任何其他方法可以设置相同的站点 属性):
- SameSite:严格
- 安全:正确
- HttpOnly: 真
并且在删除“Content-Security-Policy”和 cookie 重写规则后它已经起作用了。但是,当我尝试验证 (user/password) 时,验证 cookie 没有发送,我无法重写它们,因为它们没有随请求一起提供。
我在网络 request/response 的 Cookie 选项卡上看到以下消息: “通过 Set-Cookie header 设置 cookie 的尝试被阻止,因为它具有“SameSite=Lax”属性,但来自 cross-site 响应,而不是对 top-level 导航".
我读到它与“最近的”浏览器安全更新有关 and/or Windows/ASP.NET 安全补丁,但经过一些研究后,没有任何解决方案适合我...
我找到了解决方案:
升级到 .NET Framework 4.7.2:好的,我正在使用 4.0,我计划今年升级到 4.8。我已经在一个分支上进行了测试,并更改了该框架的一些新 cookie 属性,它起作用了。
但是我有一个客户在我们的网站上使用 iframe,迁移到 4.8 既不容易又不快,所以我找到了 URL 重写IIS模块。我已经包含了一个内容安全策略规则来添加我的(他们的)iFrame 页面主机。我点击了这些链接:
我为该客户提供的最新版本 web.config:
<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">
<!-- 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; Secure=true" />
</rule>
<!-- 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="FormsCookieAddNoneHeader">
<!-- Use this regex if your OS/framework/app adds SameSite=Lax automatically to the end of the cookie -->
<match serverVariable="RESPONSE_Set-Cookie" pattern="((.*)(ASPXFORMSAUTH[^=]*)(=.*))(?=SameSite)" />
<action type="Rewrite" value="{R:1}; SameSite=None; Secure=true" />
</rule>
<rule name="RewriteContentSecurityPolicy">
<match serverVariable="RESPONSE_Content-Security-Policy" pattern="(.*)" />
<action type="Rewrite" value="{R:0} iframehost" />
</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>