Файл cookie ASP MVC 3 теряет флаги HttpOnly и Secure

Я устанавливаю файлы 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. Так что я немного сбит с толку ...

Я попытался установить флаги HttpOnly и Secure в записи cookie web.config в System.Web:

<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 тоже не будет установлен, поэтому я сбит с толку.

=== Обновление ===

После двойной проверки оказалось, что я вас дезинформировал, ответ HttpOnly отправляется с сервера правильно при первом получении cookie, ОДНАКО! когда вызов ajax затем отправляет файл cookie на сервер, кажется, что он не добавляет флаг httponly, что означает, что выбрасываемый файл cookie больше не является таким безопасным. Защищенная часть cookie не отправляется при первом ответе, но, по крайней мере, это добавляет немного больше контекста ко всему этому.


person Grofit    schedule 27.02.2013    source источник


Ответы (2)


Попробуйте это, похоже на похожую проблему. (Как установить Флаг безопасности в файле cookie сеанса ASP.NET?)

В элемент <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>
person LiamB    schedule 27.02.2013
comment
Спасибо, попробуем, это не повлияет на HttpOnly, но не так ли? Или это тоже нужно указать в формах или что-то в этом роде? Мне кажется странным, если это работает, поскольку я ВРУЧНУЮ устанавливаю это для каждого файла cookie, поэтому я не знаю, почему он не принимает введенные данные. - person Grofit; 27.02.2013
comment
Бит формы не работает, просто сообщает мне, что web.config недействителен, но документация не загружается в MSDN, поэтому не совсем уверен, есть ли какие-то необходимые дочерние элементы. - person Grofit; 27.02.2013
comment
Хотя это не был ответ на мой вопрос, я уверен, что большинству людей, приходящих сюда, понадобится решение, которое вы указали выше, поэтому отметим вас как ответ. - person Grofit; 28.02.2013
comment
Извините, я был далеко от своего компьютера с момента публикации этого сообщения. Я проверю твой пост сейчас. Интересный вопрос .... - person LiamB; 28.02.2013
comment
Если я добавляю формы в system.web, я получаю эту ошибку: элемент system.web имеет недопустимый дочерний элемент forms. - person Stack0verflow; 30.07.2014

Похоже, что это все правильное поведение, я написал еще один вопрос конкретно о поведении файлов cookie клиента httponly, и это привело к другому сообщению ... что за кроличья нора.

https://stackoverflow.com/questions/15122308/what-should-be-the-correct-behaviour-of-browser-when-sending-and-receiving-httpo

В любом случае, это указывает на то, что серверу необходимо продолжать вмешиваться в файл cookie, чтобы добавить поведение HttpOnly.

Я создал настраиваемый httpmodule, который будет проверять наличие соответствующего файла cookie и повторно применять желаемое поведение к файлу cookie (на основе конфигураций из web.config)

person Grofit    schedule 27.02.2013