ASP MVC 3 cookie 丢失 HttpOnly 和 Secure 标志

Posted

技术标签:

【中文标题】ASP MVC 3 cookie 丢失 HttpOnly 和 Secure 标志【英文标题】:ASP MVC 3 cookie losing HttpOnly and Secure flags 【发布时间】:2013-02-13 17:30:12 【问题描述】:

我将 cookie 设置为我的 mvc 应用程序的一部分:

var cookie = new HttpCookie(CookieName, encryptedData)
            
                Path = FormsAuthentication.FormsCookiePath,
                Domain = CookieDomain,
                Expires = authenticationTicket.Expiration,
                HttpOnly = true,
                Secure = IsSecure // true
            ;
            response.Cookies.Add(cookie);

现在,如果我进行调试,我发现它一切正常,没有问题,并且添加了它,这也很好。但是由于某种原因,当它实际到达浏览器时,没有设置 HttpOnly 标志或 Secure 标志。所以我有点困惑...

我尝试在 System.Web 下的 cookie web.config 条目中设置 HttpOnly 和 Secure 标志:

<httpCookies httpOnlyCookies="true" requireSSL="true" />

下面是浏览器收到响应时的样子:

HTTP/1.1 200 OK
Cache-Control: private
Content-Type: application/json; charset=utf-8
Server: Microsoft-IIS/7.5
Access-Control-Allow-Methods: GET, POST, PUT, DELETE, OPTIONS
Access-Control-Max-Age: 10000
Access-Control-Allow-Credentials: true
Access-Control-Allow-Headers: content-type, x-requested-with, *
Access-Control-Allow-Origin: http://localhost:34567
X-AspNetMvc-Version: 3.0
X-AspNet-Version: 4.0.30319
Set-Cookie: myCookie=53BA8AF84835A81E014B9174329D8543FBB6029B71C463C6FC1305D9F966F28EAA058FE103325C0F10A3012480FB0EF3F6C0BAC4703A6A6B725F383ADA35A5C125A0438FC42CADCB0DAB77953C967E6660E51C4113C6545220A0C2F86230F446D159D523BBE9CA4D9419A67BC44D23B9C4D0974DF2ED66C47EA7308D8E42E1C2280EA6059A23303E3BCBDF28F6BD4A3DFA92FFAB33DDAC8EC05D99310D26FBD6310252156CD28B89386B0D483D6D2E295EF33487E64468655371CC446E0B5DDBF12B3AA8218AF1FA929A98638A1AC729BA60815B86EAD9624ED1787172B585BE4E457C3568AB6EAAF4865E8468D04336FA7340AAC1BA75162FB322D436DC9BF50466F2F0FB3464ECF41C6C1F7001639DFE2AB2AD9CBFB65A292FE5FA42783DF331AA4641432647BA9672FE6D4C15F830E4DF8B38605852BCB15E5B01B862D966E2FD1D620730312982DB8AB4CE5EE0D0E40E6C3F5234DE5EBFA594036D912F07C3798ED429A2552AD6C4B9EC10B90749850CBDEC97F0BF7E2E43CB3991608C5D533B6EA9F8D0A7AD949B42CD3BAA13DEE99C330121B3D868B412A3435FA01C7F223641CFE441A2E07F5DFB8B23F053CBA13F5E1262A07FBFD4EC4BADF9BD5898; expires=Wed, 27-Feb-2013 19:15:24 GMT; path=/
Date: Wed, 27 Feb 2013 18:45:24 GMT
Content-Length: 2

那么我在这里遗漏了什么吗?还是有什么我没有设置在我应该设置的地方?我也在使用 CORS,因为这个 cookie 是从网络服务器发出的,作为身份验证机制。 SSL 已启用,并且还通过 https 用于呼叫。即使我关闭了安全 cookie 并使用 http,HTTPOnly 标志也没有设置,所以我很困惑。

=== 更新 ===

经过仔细检查,我似乎误会了你,在你第一次收到 cookie 时,HttpOnly 响应是从服务器正确发送的,但是!当 ajax 调用然后将 cookie 发送到服务器时,它似乎没有添加 httponly 标志,这意味着被抛出的 cookie 不再安全。 cookie 的安全部分不会在第一次响应时发送出去,但至少这会增加一点上下文。

【问题讨论】:

【参考方案1】:

试试这个,看起来类似的问题。 (How can I set the Secure flag on an ASP.NET Session Cookie?)

&lt;system.web&gt; 元素中,添加以下元素:

<httpCookies requireSSL="true" />

但是,如果您的 system.web\authentication 块中有 &lt;forms&gt; 元素,那么这将覆盖 httpCookies 中的设置,将其设置回默认值 false。

在这种情况下,您还需要将requireSSL="true" 属性添加到表单元素。

所以你最终会得到:

<system.web>
  <authentication mode="Forms">
    <forms requireSSL="true">
        /* forms content */
    </forms>
  </authentication>
</system.web>

【讨论】:

谢谢,试一试,这不会影响 HttpOnly 吗?还是需要在表格或其他东西上设置?我觉得这很奇怪,因为我手动设置每个 cookie,所以我不知道为什么它不接受输入的详细信息。 表单位不起作用,只是告诉我 web.config 无效,但文档不会加载到 MSDN 上,所以不完全确定是否有一些必需的子元素。 虽然这不是我问题的答案,但我相信大多数来到这里的人都需要您上面列出的解决方案,因此会将您标记为答案。 抱歉,自从发布此消息后,我就离开了我的机器。我现在会检查你的帖子。有趣的问题.... 如果我在 system.web 下添加表单,我会收到此错误:元素 'system.web' 具有无效的子元素 'forms'。【参考方案2】:

这似乎都是正确的行为,我专门写了另一个关于 httponly 客户端 cookie 行为的问题,这导致了另一个帖子......真是个兔子洞。

What should be the correct behaviour of browser when sending and receiving httponly cookie via ajax?

这似乎表明服务器需要不断篡改 cookie 以添加 HttpOnly 行为。

我已经制作了一个自定义 httpmodule,它将检查有问题的 cookie 并将所需的行为重新应用于 cookie(基于 web.config 中的配置)

【讨论】:

以上是关于ASP MVC 3 cookie 丢失 HttpOnly 和 Secure 标志的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 asp.net mvc 3 和 c# 清除 cookie?

将会话 cookie 设置为 HttpOnly

使用 WIF 和 jquery ajax 请求时 ASP.NET MVC 3 中的会话 Cookie 过期处理

.NET MVC 5:在请求之间丢失 cookie

ASP.NET Core MVC:设置身份 cookie 过期

ASP MVC Cookie 不持久