Подтвердить что ты не робот

HttpWebRequest cookie с пустым доменом

У меня есть действие ASP.NET MVC, которое отправляет запрос GET на другой сервер через HttpWebRequest. Я хотел бы включить все файлы cookie в исходный запрос действия в новый запрос. Некоторые из System.Web.HttpCookies в исходном запросе имеют пустые значения домена (т.е. ""), Что, по-видимому, не вызывает никаких проблем. Когда я создаю System.Net.Cookie, используя имя, значение, путь и домен каждого из этих файлов cookie и добавляя его в запрос CookieContainer, я получаю эту ошибку:

"System.ArgumentException: параметр '{0}' не может быть пустой строкой. Имя параметра: cookie.Domain

Здесь некоторый код, который будет вызывать ту же ошибку (при добавлении файла cookie):

var request = (HttpWebRequest)WebRequest.Create("http://www.whatever.com");
request.Method = "GET";
request.CookieContainer = new CookieContainer();
request.CookieContainer.Add ( new Cookie ( "MyCookieName", "MyCookieValue", "/", "") );

ИЗМЕНИТЬ

Я вроде как исправил это, используя "localhost" для домена, вместо нулевого или пустого значения строки из исходного HttpCookie. Итак, почему пустой домен не работает для CookieContainer? И использует ли HttpCookie пустое значение для обозначения localhost или мне нужно найти другое исправление для этой проблемы?

4b9b3361

Ответ 1

Отказ от ответственности:

Как указано ранее @feroze, установка домена cookie на localhost не будет так хорошо работать для вас. Я предполагаю, что вы пишете помощника, который позволяет туннелировать HTTP-запросы в чужие домены. Обратите внимание, что это не самая лучшая практика и во многих случаях не требуется (т.е. jQuery имеет много классной кросс-доменной поддержки, встроенной, также см. Новую спецификация CORS). Но иногда вы можете это делать (т.е. Внешний ресурс - только XML и находится на сервере, который не поддерживает CORS).

Фоновая информация о доменах cookie и о том, как они работают:

Если вы еще не взглянули на HTTP Cookie: Домен и путь в Википедии - почти все, что вам нужно знать, находится там.

При оценке файла cookie домен и путь учитываются и клиентом ( "местным" реквестером) и веб-сервером ( "иностранным" ответчиком). Когда клиент запрашивает ресурс, клиент должен отправлять только файлы cookie, если эти файлы cookie соответствуют домену (или более общий родительский домен) и Path (или более общий родительский путь ) запрашиваемого URI.

Веб-браузеры обрабатывают это правильно. Если у веб-браузера есть файл cookie для домена "localhost" и вы запрашиваете "google.com", например, эти файлы cookie для домена "localhost" не будут отправляться в запрос на "google.com". - На самом деле, большинство современных браузеров не просто не отправят их, они полностью игнорируют их в заголовках ответов Set-Cookie, которые они получают (они называются сторонними куки файлами, что позволяет принимать сторонние файлы cookie в вашем веб-браузер - это серьезная проблема конфиденциальности/безопасности - не делайте этого!).

Он работает и в другом направлении - даже если маловероятно, что клиент может включить сторонний файл cookie в запрос, если он это делает, он должен игнорировать его (и даже некоторые файлы cookie для правильного доменов/путей, чтобы предотвратить печально известную проблему супер-cookie (т.е. веб-сервер, на котором размещен сайт example.com, должен игнорировать файлы cookie, принадлежащие его родительскому домену:.com ", потому что".com "- это" публичный суффикс ")).

Что вы должны делать [если вам нужно]:

Курс действий, рекомендуемый для вас, - это когда вы читаете в своих cookie-клиентах (я не парень MVC, но в обычном ASP.NET это будет в Request.Cookies), проведите через них (убедитесь, что отфильтровывать свой собственный сайт законными кукисами, особенно SessionId и т.д., или использовать Путь должным образом, чтобы они никогда не отправлялись на эту страницу в первую очередь), а затем добавлять их по одному в коллекцию cookie исходящего запроса, переписывая домен чтобы быть "www.whatever.com" (в вашем примере - если вы делаете это динамически, загрузите URL-адрес в новый объект Uri() и используйте свойство .Host), а затем установите путь в "/", - Это создаст заголовок "Cookie" для исходящего запроса на внешний веб-сервер.

Когда этот запрос возвращается на ваш сервер, вам необходимо проверить его входящий ответ на новые файлы cookie - эти куки могут быть переупакованы и отправлены обратно вашему клиенту в том же типе цикла, что и в предыдущем абзаце, за исключением того, что вы захотите переписать Host для Request.Url.Host - и вам нужно будет установить путь обратно к "/", если только путь к вашей странице passthru не является статичным (я предполагаю, что это не так вы используете MVC), тогда вы хотите, например, установить его в Request.Url.AbsolutePath.

Счастливое кодирование!

EDIT: Кроме того, вы захотите установить тег X-Forwarded-For исходящего запроса, чтобы веб-сайт, на который вы звоните, не думает, что ваш веб-сервер один клиент, который спамал дерьмо из них.

Ответ 2

Некоторые фон

Это происходит потому, что CookieContainer - это клиентский контейнер, предназначенный для повторного использования через несколько HttpWebRequest. Повторное использование обеспечивает ожидаемое поведение cookie, которое куки, установленные удаленным хостом, отправляются обратно с каждым последующим HttpWebRequests, нацеленным на тот же хост.

В результате повторного использования CookieContainer может содержать куки из нескольких запросов и\или хостов.

Итак, чтобы определить, какое из файлов cookie в контейнере необходимо отправить с определенным HttpWebRequest на какой-либо хост (домен), CookieContainer проверяет свойство домена и путь.

Вот почему Cookie в CookieContainer должен иметь действующий Домен.

И наоборот, на серверной стороне файлы cookie доставляются другим типом, CookieCollection, который представляет собой простой список файлов cookie без дополнительной логики.


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

Ответ 3

Не уверен, что он решает вашу проблему. Но для добавления файлов cookie без свойства "Домен" вы должны добавить в заголовки файлы cookie с помощью HttpRequestHeader.Cookie следующим образом.

request.Headers.Add(HttpRequestHeader.Cookie, "Your cookies...");

Надеюсь, что это поможет!

Ответ 4

Вы пытаетесь получить файлы cookie, отправленные на localhost, правильно?

Почему бы вам не сделать что-то подобное, когда вы даете своей машине реальное имя:

  • Отредактируйте файл хостов и добавьте строку "127.0.0.1 myname.com"
  • Тест с использованием myname.com - который на самом деле является вашим локальным хостом.

Ваш браузер или приложение не узнает разницу и не отправит файлы cookie на myname.com, если это принадлежит файлу cookie.

Подробная информация:

  • Файл Hosts в Windows находится в папке C:\Windows\System32\drivers\etc\hosts