我们有一个用户可以登录和注销的网络服务。 Cookie用于确定用户是否已登录。
该服务公开了多个“网站”,每个网站都由子域标识。例如:
http://customer1.ourservice.com/
http://customer2.ourservice.com/
有两种方法可以登录; “服务范围”或“特定网站”。
“服务范围”登录请求将发送到特殊子域(http://globalauth.ourservice.com/
)。此类登录请求会生成Set-Cookie
标头,如下所示:
Set-Cookie: OUR-COOKIE=<<cookie-value>>;
expires=Wed, 03 May 2017 11:25:58 GMT;
domain=.ourservice.com;
path=/;
httponly
(此处添加换行符以便于阅读)
domain=.ourservice.com
设置使Cookie可供所有子域使用。
“特定于站点”的登录请求将发送到站点特定的子域。它们会生成Set-Cookie
标题,如下所示:
Set-Cookie: OUR-COOKIE=<<cookie-value>>;
expires=Wed, 03 May 2017 11:23:42 GMT;
path=/;
httponly
退出请求始终发送到特定于站点的子域,并且应该删除“侧边”登录和“特定于站点”登录的cookie。
退出请求会产生Set-Cookie
标头,如下所示:
Set-Cookie: OUR-COOKIE=;
expires=Mon, 02 May 2016 11:26:54 GMT;
path=/;
httponly,
OUR-COOKIE=;
expires=Mon, 02 May 2016 11:26:54 GMT;
domain=.ourservice.com;
path=/;
httponly
这里的想法是,特定于站点的cookie和服务范围的cookie都应该被清除并过期。
当使用“服务范围”登录时,它会起作用,但在使用“特定于站点”的登录时不起作用。
根本不会从浏览器中删除特定于站点的cookie。
我们如何正确指示浏览器过期/删除Cookie,无论是否使用domain
设置发布?
答案 0 :(得分:0)
事实证明,这是由于.NET Framework 4.0和4.5中与WCF相关的错误。
规范RFC 6265不允许在单个Set-Cookie
标头中传输多个逗号分隔的Cookie。相反,应使用多个Set-Cookie
标头(每个Cookie一个)。
我们正在使用HttpResponseHeadersExtensions.AddCookies添加Cookie。该方法的文档清楚地说:
每个Set-Cookie标头都表示为 一个 CookieHeaderValue实例。
然而,事实证明,多个CookieHeaderValue实例确实合并为一个逗号分隔的Set-Cookie
标头 - 该规范不支持该标头。
请参阅StackOverflow上的以下相关帖子:
后一篇文章引用:
&#34; Set-Cookie&#34;被导入单个cookie行被记录为Microsoft .NET Framework 4.0和Framework 4.5中的错误。在Microsoft WCF开发组中,该错误列为&#34;已关闭&#34;并且&#34;不会修复&#34;。
根据Microsoft的说法,唯一的解决方法是从IIS中的自托管迁移到托管,然后直接使用(IIS)Response对象(没有错误的不同代码路径)。
这对我们来说是个坏消息,因为我们目前与使用自托管代码路径有关。我们必须找到解决这个问题的方法。