Отправка файлов cookie с использованием HttpCookieCollection и CookieContainer
-
06-07-2019 - |
Вопрос
Я хочу выполнить туннелирование через HTTP-запрос с моего сервера на удаленный сервер, передавая все файлы cookie.Поэтому я создаю новый HttpWebRequest
объект и хотите установить на нем файлы cookie.
HttpWebRequest.CookieContainer
является типом System.Net.CookieContainer
который удерживает System.Net.Cookies
.
По моему входящему объекту запроса:
HttpRequest.Cookies
является типом System.Web.HttpCookieCollection
который удерживает System.Web.HttpCookies
.
По сути, я хочу иметь возможность назначать их друг другу, но разные типы делают это невозможным.Должен ли я преобразовать их, скопировав их значения, или есть лучший способ?
Решение
Вот код, который я использовал для передачи объектов cookie из входящего запроса в новый HttpWebRequest ... (" myRequest " это имя моего объекта HttpWebRequest.)
HttpCookieCollection oCookies = Request.Cookies;
for ( int j = 0; j < oCookies.Count; j++ )
{
HttpCookie oCookie = oCookies.Get( j );
Cookie oC = new Cookie();
// Convert between the System.Net.Cookie to a System.Web.HttpCookie...
oC.Domain = myRequest.RequestUri.Host;
oC.Expires = oCookie.Expires;
oC.Name = oCookie.Name;
oC.Path = oCookie.Path;
oC.Secure = oCookie.Secure;
oC.Value = oCookie.Value;
myRequest.CookieContainer.Add( oC );
}
Другие советы
Мне нужно было сделать это сегодня для сайта SharePoint, который использует проверку подлинности на основе форм (FBA). Если вы попытаетесь вызвать страницу приложения без клонирования файлов cookie и назначения объекта CookieContainer, запрос будет отклонен.
Я решил абстрагировать работу от этого удобного метода расширения:
public static CookieContainer GetCookieContainer(this System.Web.HttpRequest SourceHttpRequest, System.Net.HttpWebRequest TargetHttpWebRequest)
{
System.Web.HttpCookieCollection sourceCookies = SourceHttpRequest.Cookies;
if (sourceCookies.Count == 0)
return null;
else
{
CookieContainer cookieContainer = new CookieContainer();
for (int i = 0; i < sourceCookies.Count; i++)
{
System.Web.HttpCookie cSource = sourceCookies[i];
Cookie cookieTarget = new Cookie() { Domain = TargetHttpWebRequest.RequestUri.Host,
Name = cSource.Name,
Path = cSource.Path,
Secure = cSource.Secure,
Value = cSource.Value };
cookieContainer.Add(cookieTarget);
}
return cookieContainer;
}
}
Затем вы можете просто вызвать его из любого объекта HttpRequest с целевым объектом HttpWebRequest в качестве параметра, например:
HttpWebRequest request;
request = (HttpWebRequest)WebRequest.Create(TargetUrl);
request.Method = "GET";
request.Credentials = CredentialCache.DefaultCredentials;
request.CookieContainer = SourceRequest.GetCookieContainer(request);
request.BeginGetResponse(null, null);
где TargetUrl - это URL-адрес страницы, за которой я следую, а SourceRequest - это запрос HttpRequest страницы, на которой я сейчас нахожусь, полученной через Page.Request.
Предложение Дэвида является правильным.Вам нужно скопировать.Просто создайте функцию для повторного копирования.Объект HttpCookie и Cookie создан для того, чтобы убедиться, что мы можем различать как его функциональность, так и то, откуда он берется.HttpCookie, используемый между пользователем и вашим прокси-сервером, файл cookie используется между вашим прокси-сервером и удаленным веб-сервером.
HttpCookie обладает меньшей функциональностью, поскольку файл cookie исходит от вас, и вы знаете, как с ним обращаться.Файлы cookie предоставляют вам возможность управлять файлами cookie, получаемыми с веб-сервера.Как и CookieContainer, его можно использовать для управления доменом, путем и сроком действия.
Таким образом, пользовательская сторона и сторона веб-сервера отличаются друг от друга, и чтобы подключить их, конечно, вам нужно их преобразовать.В вашем случае это просто прямое назначение.
Обратите внимание, что в CookieContainer есть ошибка в .Add(Cookie) и .Метод getCookies(uri).
Смотрите подробности и исправляйте здесь:
http://dot-net-expertise.blogspot.com/2009/10/cookiecontainer-domain-handling-bug-fix.html
Позвони Меланну