我们有一个可供用户登录和注销的Web服务。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过期/删除,而不管它是否带有domain
设置?
事实证明,这是由于.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上的以下相关文章:
后一篇文章的引文:
在Microsoft .NET Framework 4.0和Framework 4.5中,“ Set-Cookie”被合并到单个cookie行中这一事实被记录为Microsoft中的错误。在Microsoft WCF开发组中,该错误被列为“已关闭”和“无法修复”。
根据Microsoft的说法,唯一的解决方法是从IIS中的自托管迁移到托管,然后直接使用(IIS)响应对象(没有错误的不同代码路径)。
这对我们来说是个坏消息,因为我们目前只能使用自托管代码路径。我们将必须找到解决此错误的方法。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句