如何正确过期cookie?

时间:2016-05-03 11:49:42

标签: .net http cookies self-hosting

我们有一个用户可以登录和注销的网络服务。 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设置发布?

1 个答案:

答案 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对象(没有错误的不同代码路径)。

这对我们来说是个坏消息,因为我们目前与使用自托管代码路径有关。我们必须找到解决这个问题的方法。