在Azure Web App中未设置SameSite None cookie属性

时间:2020-01-14 10:12:22

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

为了为即将在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

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

这是Azure的问题吗?要在网络应用上进行任何配置才能使其正常运行,或者我必须以其他方式设置Cookie?

3 个答案:

答案 0 :(得分:7)

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

编辑:Chrome现在希望您在使用SameSite = none时在Cookie中添加secure;

<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重写。 https://www.iis.net/downloads/microsoft/url-rewrite

答案 1 :(得分:5)

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

我们看到的是同一件事,专门针对同一站点问题更新到4.7.2。

这似乎是由Microsoft在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的时间戳为2019年11月12日,但经过反编译后看到:

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

微软的巴里·多兰斯(Barry Dorrans)似乎在此页面底部https://devblogs.microsoft.com/aspnet/upcoming-samesite-cookie-changes-in-asp-net-and-asp-net-core/处确认尚未将其推广到Azure。

编辑:我们已经获悉,该补丁将从本周开始发布到Azure,并有望在1月31日完成。

此更新在此处正式传达:https://docs.microsoft.com/answers/questions/6842/announcement-samesite-cookie-handling-and-net-fram.html

答案 2 :(得分:0)

同一站点cookie更改在dot Net Framework 4.7.2及更高版本中得到解决。

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

App Service版本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

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