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”和 cookie 重写规则后它已经起作用了。但是,当我尝试验证 (user/password) 时,验证 cookie 没有发送,我无法重写它们,因为它们没有随请求一起提供。

我在网络 request/response 的 Cookie 选项卡上看到以下消息: “通过 Set-Cookie header 设置 cookie 的尝试被阻止,因为它具有“SameSite=Lax”属性,但来自 cross-site 响应,而不是对 top-level 导航".

我读到它与“最近的”浏览器安全更新有关 and/or Windows/ASP.NET 安全补丁,但经过一些研究后,没有任何解决方案适合我...

我找到了解决方案:

  1. 升级到 .NET Framework 4.7.2:好的,我正在使用 4.0,我计划今年升级到 4.8。我已经在一个分支上进行了测试,并更改了该框架的一些新 cookie 属性,它起作用了。

  2. 但是我有一个客户在我们的网站上使用 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>