9

我将 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 的安全部分不会在第一次响应时发送出去,但至少这会增加一点上下文。

4

2 回答 2

11

试试这个,看起来像一个类似的问题。(如何在 ASP.NET 会话 Cookie 上设置安全标志?

<system.web>元素中,添加以下元素:

<httpCookies requireSSL="true" />

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

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

所以你最终会得到:

<system.web>
  <authentication mode="Forms">
    <forms requireSSL="true">
        /* forms content */
    </forms>
  </authentication>
</system.web>
于 2013-02-27T19:01:38.777 回答
2

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

通过ajax发送和接收httponly cookie时浏览器的正确行为应该是什么?

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

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

于 2013-02-27T21:28:29.260 回答