ASP.NET не может правильно обрабатывать файлы cookie с разделителями-запятыми

Согласно RFC, отдельные файлы cookie в заголовке HTTP "Cookie" могут быть разделены как запятыми, так и точкой с запятой. Однако ASP.NET неправильно разбирает регистр запятых - он не считает запятую в качестве разделителя, а считает ее просто частью значения.

Например, если клиент отправляет заголовок Cookie: a=b, c=d, приложение ASP.NET увидит только один файл cookie с именем «a» со значением «b, c = d».

В особом случае то же самое происходит, когда клиент отправляет несколько заголовков файлов cookie (по одному для каждого файла cookie) вместо объединения всех файлов cookie в один заголовок. С точки зрения HTTP это полностью верно, и в таком случае эффективное значение заголовка должно быть объединением значений всех его экземпляров, разделенных запятыми.

Кто-нибудь знает обходной путь (или, может быть, исправление?) Для этого? Мне абсолютно необходимо, чтобы это работало, потому что я не контролирую клиента.

P.S. По иронии судьбы, согласно этот поток, поведение встроенного HTTP-клиента .NET (также известного как HttpWebRequest) прямо противоположно и также вызывает проблемы. :-)


person Fyodor Soikin    schedule 06.03.2010    source источник


Ответы (3)


Я считаю, что самым простым решением для получения желаемого поведения (независимо от правильности стандартов) было бы создание HttpModule, который правильно анализировал бы эту информацию из HttpContext.Request.Headers и помещал исправленную информацию в HttpContext.Request.Cookies.

person G-Wiz    schedule 07.03.2010
comment
Ага, это то, чем я закончил. - person Fyodor Soikin; 07.03.2010

Как известно, RFC 2109 и RFC 2965 не описывают реальность.

Вам следует взглянуть на http://greenbytes.de/tech/webdav/draft-ietf-httpstate-cookie-04.html, который является продуктом новой рабочей группы IETF httpstate.

person Julian Reschke    schedule 07.03.2010

Версия, на которую вы ссылаетесь, устарела. Этот HTTP State Management Mechanism документ является самым последним и лучшим, и в нем указаны точки с запятой. В нем говорится, что для будущей совместимости следует использовать запятые, но это не обязательно:

Примечание. Для обеспечения обратной совместимости в заголовке файла cookie в качестве разделителя используется точка с запятой (;). Серверу СЛЕДУЕТ также принимать запятую (,) в качестве разделителя между значениями cookie для будущей совместимости.

person Keltex    schedule 07.03.2010
comment
Ой! Большое спасибо за ссылку. Однако это означает, что браузер BlackBerry не соответствует стандарту. Я обнаружил, что для изображений (ПРИМЕЧАНИЕ: только для изображений!) Он отправляет каждый файл cookie в отдельном заголовке, что заставляет ASP.NET (или IIS?) Объединять их запятыми (согласно стандарту HTTP, если я не снова ошибаюсь), что, в свою очередь, приводит к неправильному синтаксическому анализу файлов cookie. Пожалуйста, подтвердите, что моя логика здесь верна, и я отправлю ее на рассмотрение RIM. - person Fyodor Soikin; 07.03.2010