【问题标题】:SameSite None cookie attribute not set in Azure Web App在 Azure Web App 中未设置 SameSite None cookie 属性
【发布时间】:2020-05-01 01:13:49
【问题描述】:

为了准备 Chrome 80 中即将对 SameSite 进行的更改,我已将 .NET Framework API 从 4.6.2 升级到 4.7.2。

我创建了一个简单的测试端点,它只是使用SameSite=None 设置一个 cookie:

public class TestController : ApiController
{
    public IHttpActionResult Get()
    {
        var cookie = new HttpCookie("foo", "bar")
        {
            HttpOnly = true,
            Secure = true,
            SameSite = SameSiteMode.None
        };

        HttpContext.Current.Response.SetCookie(cookie);

        return Ok();
    }
}

这在本地按预期工作,并返回以下标头:

set-cookie: foo=bar; path=/; secure; HttpOnly; SameSite=None

但是,当发布到配置为 4.7 作为运行时堆栈的 Azure Web 应用程序时,这不起作用。 Web 应用返回不带 SameSite 的 cookie 标头:

Set-Cookie: foo=bar; path=/; secure; HttpOnly

如果我将其设置为 Strict 或 Lax,它在 Azure 中也可以正常工作。

这是 Azure 的问题吗?是否需要在网络应用程序上配置任何内容才能使其正常工作,或者我必须以不同的方式设置 cookie?

【问题讨论】:

    标签: asp.net azure cookies azure-web-app-service


    【解决方案1】:

    Azure 将在月底前更新 - 请在此处查看官方公告:https://docs.microsoft.com/answers/questions/6842/announcement-samesite-cookie-handling-and-net-fram.html

    我们看到了同样的情况,专门更新到 4.7.2 以解决相同的站点问题。

    这似乎是微软在 11 月 10 日发布的补丁,但尚未在 Azure 上提供。

    正在部署的站点以 .Net 4.7.2 为目标,并且更改在本地测试时按预期工作。

    如果我们反编译 System.Web.dll(通过 Kudu 下载),我们会看到不处理同站点 cookie 的旧版本。

    这对其他人来说似乎是一个问题(尽管有 4.8 主题,但对于 4.7.2)。

    https://feedback.azure.com/forums/169385-web-apps/suggestions/37566262-upgrade-app-service-with-net-4-8

    System.Web.dll 上的时间戳是 11/12/2019 但反编译后看到:

      if (this._sameSite != SameSiteMode.None)
            {
                stringBuilder.Append("; SameSite=");
                stringBuilder.Append(this._sameSite);
            }
    

    Microsoft 的 Barry Dorrans 似乎在此页面底部确认此功能尚未推广到 Azure:https://devblogs.microsoft.com/aspnet/upcoming-samesite-cookie-changes-in-asp-net-and-asp-net-core/,我们也已将其作为问题提出。

    编辑:我们已获悉该补丁将于本周开始在 Azure 中推出,预计将于 1 月 31 日完成。

    更新官方在这里传达:https://docs.microsoft.com/answers/questions/6842/announcement-samesite-cookie-handling-and-net-fram.html

    【讨论】:

    • Azure 云服务(经典)是否也会获得正确处理 SameSite 的更新?
    【解决方案2】:

    来自https://stackoverflow.com/a/38957177/1322009。一种适用于 4.6.1 的解决方案是将以下内容添加到您的 web.config

    编辑:Chrome 现在希望您在使用 SameSite=none 时将secure; 包含在您的 Cookie 中。

    <system.webServer>
     <rewrite>
           <outboundRules>
                <clear />
                <rule name="Add SameSite" preCondition="No SameSite">
                    <match serverVariable="RESPONSE_Set_Cookie" pattern=".*" negate="false" />
                    <action type="Rewrite" value="{R:0}; secure; SameSite=none" />
                    <conditions>
                    </conditions>
                </rule>
                <preConditions>
                    <preCondition name="No SameSite">
                        <add input="{RESPONSE_Set_Cookie}" pattern="." />
                        <add input="{RESPONSE_Set_Cookie}" pattern="; secure; SameSite=none" negate="true" />
                    </preCondition>
                </preConditions>
            </outboundRules>
      </rewrite>
     </system.webServer>
    

    这假定您在托管自己的 iis 站点时安装了 url rewrite。 https://www.iis.net/downloads/microsoft/url-rewrite

    【讨论】:

    • 我从 Microsoft 文档中尝试了很多东西,但都没有用。
    【解决方案3】:

    在 dot Net Framework 4.7.2 及更高版本上解决了相同的站点 cookie 更改。

    如果您想在 App Service 确认这些更改,请导航到 Kudu(SCM) 端点,在环境变量下您应该能够找到 App Service Platform 版本。

    应用服务版本:86.0.7.148(或更高版本)上可用的相同站点 cookie 更新。

    完整的变更详情请见https://azure.microsoft.com/en-in/updates/app-service-samesite-cookie-update/

    如果您因这些更改而受到影响,您可以使用以下配置更改暂时解除阻止:

    <configuration>
            <system.web>
                  <sessionState cookieSameSite="None" />
            </system.web>
    </configuration>
    

    在 Chrome 浏览器版本 80 及更高版本(将是 Chromium)上,即使这些配置可能无法正常工作,需要修复代码。

    请注意,通过上述更改,旧版浏览器将无法运行;从支持 2016 SameSite 标准的旧版浏览器访问的应用程序在获取值为 None 的 SameSite 属性时可能会中断。

    您可以使用以下方式检查用户代理(浏览器) httpContext.Request.UserAgent

    希望以上信息对你有所帮助:)

    【讨论】:

    • 有人知道 Azure 云服务(经典)是否会正确处理 SameSite 的更新?
    • 云服务只是为您提供部署环境;它与处理应用程序级别的安全策略无关。同一个站点是浏览器的安全性,并且必须使用应用程序堆栈来解决。例如.Net 框架提供了快速修复,但对于长期运行的应用程序代码更改需要类似的方式,它需要从其他应用程序堆栈进行修复。
    • 好吧,当我理解正确时 - Azure 云服务(经典)仅使用操作系统级别的安全补丁进行维护。在此 Azure 云服务上额外部署的 .Net 框架 4.8 - 必须通过部署进行更新。也许通过网络安装程序重新部署将获得 SameSite 的最新修复...
    猜你喜欢
    • 2020-12-28
    • 2020-07-04
    • 2021-07-22
    • 2020-12-20
    • 2020-04-25
    • 1970-01-01
    • 2020-04-18
    • 1970-01-01
    • 2019-12-18
    相关资源
    最近更新 更多