为了为即将在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?
答案 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)。
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日完成。
答案 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
希望以上信息对您有帮助:)