Отправка файлов cookie с использованием HttpCookieCollection и CookieContainer - PullRequest
24 голосов
/ 31 июля 2009

Я хочу туннелировать через HTTP-запрос с моего сервера на удаленный сервер, пропуская все куки. Поэтому я создаю новый объект HttpWebRequest и хочу установить на него файлы cookie.

HttpWebRequest.CookieContainer - это тип System.Net.CookieContainer, который содержит System.Net.Cookies.

В моем объекте входящего запроса:

HttpRequest.Cookies - это тип System.Web.HttpCookieCollection, который содержит System.Web.HttpCookies.

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

Ответы [ 3 ]

36 голосов
/ 31 июля 2009

Вот код, который я использовал для переноса объектов 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 );
}
3 голосов
/ 28 мая 2013

Мне нужно было сделать это сегодня для сайта 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.

1 голос
/ 08 октября 2009

Правильное предложение от Давида. Вам нужно скопировать. Просто создайте функцию для повторного копирования. Объекты HttpCookie и Cookie создаются для того, чтобы мы могли различать как их функциональные возможности, так и место их использования. HttpCookie используется между пользователем и вашим прокси. Cookie используется между вашим прокси и удаленным веб-сервером.

HttpCookie обладает меньшими функциональными возможностями, поскольку файл cookie создан вами, и вы знаете, как с ним обращаться. Cookie позволяют управлять файлами cookie, полученными с веб-сервера. Как и CookieContainer, его можно использовать для управления доменом, путем и сроком действия.

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

Обратите внимание, что в CookieContainer есть ошибка в методах .Add (Cookie) и .GetCookies (uri).

Смотрите подробности и исправляйте здесь:

http://dot -net-expertise.blogspot.com / 2009/10 / cookiecontainer-домен-обработка-ошибка-fix.html

CallMeLaNN

...