【问题标题】:How to properly expire cookie?如何正确过期cookie?
【发布时间】:2016-05-03 11:49:42
【问题描述】:

我们有一个网络服务,用户可以登录和退出。 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 http cookies self-hosting


    【解决方案1】:

    事实证明,这是由于 .NET 框架 4.0 和 4.5 中与 WCF 相关的错误造成的。

    规范RFC 6265 不允许在单个Set-Cookie 标头中传输多个逗号分隔的cookie。相反,应该使用多个 Set-Cookie 标头(每个 cookie 一个)。

    我们正在使用 HttpResponseHeadersExtensions.AddCookies 添加 cookie。该方法的文档清楚地表明:

    每个 Set-Cookie 标头都表示为 一个 CookieHeaderValue 实例。

    但是,事实证明,多个 CookieHeaderValue 实例确实合并为一个以逗号分隔的 Set-Cookie 标头 - 规范不支持。

    在 StackOverflow 上查看以下相关帖子:

    引用后一篇文章:

    “Set-Cookie”被合并到单个 cookie 行中的事实在 Microsoft 中被记录为 .NET Framework 4.0 和 Framework 4.5 的错误。在 Microsoft WCF 开发组中,该错误被列为“已关闭”且“不会修复”。

    根据微软的说法,唯一的解决方法是从自托管转移到在 IIS 内托管,然后直接使用 (IIS) 响应对象(没有错误的不同代码路径)。

    这对我们来说是个坏消息,因为我们目前使用自托管代码路径。我们必须想办法解决这个错误。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-04-22
      • 2013-05-21
      • 1970-01-01
      • 1970-01-01
      • 2014-10-07
      • 1970-01-01
      相关资源
      最近更新 更多