如何正确终止Cookie?

莫滕·维克斯特伦(MårtenWikström)

我们有一个可供用户登录和注销的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设置?

莫滕·维克斯特伦(MårtenWikström)

事实证明,这是由于.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] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章