C# HTTPWebRequest против переговоров /Basic с Realm Site

Извините, что задал еще один вопрос по этой теме, но я читал и не могу заставить его работать...

Приступая к делу... У меня есть ссылка, которая загрузит ZIP-файл. Мне предоставили доступ к этому сайту (мой пользователь), и теперь я пытаюсь написать программу, которая время от времени извлекает zip.file, чтобы я мог что-то делать с его данными.

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

HttpWebRequest request;
HttpWebResponse response;

request = (HttpWebRequest)WebRequest.Create(strURL);

request.Credentials = ((domain == null || domain == "") ?
                new System.Net.NetworkCredential(user, pass) :
                new System.Net.NetworkCredential(user, pass, domain)));

response = (HttpWebResponse)request.GetResponse();
//...do somthing

После прочтения и поиска я пришел к выводу, что должен был явно сказать аутентификации. метод и нашел пример CredentialCache. После этого я открыл фиддлер, посмотрел, что отвечает веб-сайт, и нашел следующие заголовки:

WWW-Authenticate: Negotiate
WWW-Authenticate: Basic realm="BACKLOG ::::::: AUTENTICACAO NECESSARIA - USAR APENAS USERNAME E PASSWORD DE DOMINIO"

С этим я мог знать что такое аутенти. введите мне нужно, поэтому я изменил свой код на следующее:

HttpWebRequest request;
HttpWebResponse response;

request = (HttpWebRequest)WebRequest.Create(strURL);

CredentialCache cc = new CredentialCache();
cc.Add(new Uri(strURL), "Negotiate", (
                (domain == null || domain == "") ?
                new System.Net.NetworkCredential(user, pass) :
                new System.Net.NetworkCredential(user, pass, domain)));

request.Credentials = cc;

response = (HttpWebResponse)request.GetResponse();
//...do somthing

Тем не менее, я получаю 401 HTTP-ошибку. Прочитав немного больше, я обнаружил, что мне, вероятно, нужно добавить request.PreAuthenticate = true; но результат был тот же. Я также читал, что мне нужно было использовать request.Credentials = System.Net.CredentialCache.DefaultNetworkCredentials; который остановил ошибку 401 HTTP, но начал выдавать ошибку "Слишком много автоматических перенаправлений", которая заставила меня отказаться от этой идеи, поскольку учетные данные по умолчанию - это не то, что я хочу, я действительно хочу иметь возможность изменять учетные данные пользователя.

После нескольких попыток я сдался и попробовал базовую аутентификацию. метод, но безуспешно (я думаю, что я пропускаю часть "царства").

HttpWebRequest request;
HttpWebResponse response;

request = (HttpWebRequest)WebRequest.Create(strURL);

CredentialCache cc = new CredentialCache();
cc.Add(new Uri(strURL), "Basic", (
                (domain == null || domain == "") ?
                new System.Net.NetworkCredential(user, pass) :
                new System.Net.NetworkCredential(user, pass, domain)));

request.Credentials = cc;

response = (HttpWebResponse)request.GetResponse();
//...do somthing

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

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

================================================== ================================================== ==== ОБНОВЛЕНИЕ 1

После сравнения запросов браузер и приложение я вижу некоторые различия в первом сделанном запросе.

браузер

ПОЛУЧИТЕ http://example.host/maps/selector/download?map_name=workline_fornecedores&organization_id=1 HTTP / 1.1 Принять: application / x-ms-application, image / jpeg, application / xaml + xml, image / gif, image / pjpeg, application / x-ms-xbap, application / vnd.ms-excel, application / vnd.ms-powerpoint, application / msword, application / x-shockwave-flash, / Accept-Language: пользовательский агент PTSI: Mozilla/4.0 (совместимо; MSIE 7.0; Windows NT 6.1; WOW64; Trident/4.0; SLCC2; .NET CLR 2.0.50727; .NET CLR 3.5.30729; .NET CLR 3.0.30729; Медиа-центр ПК 6.0; InfoPath.2; MS-RTC LM 8; .NET4.0C; .NET4.0E; .NET CLR 1.1.4322) Accept-Encoding: gzip, deflate Соединение: Keep-Alive Хост: example.host Cookie: WT_FPC=id=2edd0fbf206582555011375854627180:lv=1375854634144: сс = 1375854627180; _swa_uv = 527730711375858227; __utma = 163226403.1634134224.1376900542.1376900542.1376900542.1

....

Приложение

ПОЛУЧИТЕ http://example.host/maps/selector/download?map_name=workline_fornecedores&organization_id=1 HTTP / 1.1 Хост: example.host Cache-Control: без хранилища, без кэша Прагма: без кэша Соединение: Keep-Alive

В обоих примерах сервер отвечает 401 HTTP, но с отличиями

...

браузер

ПОЛУЧИТЕ http://example.host/authorizer/check_remote_user?url=%2Fmaps%2Fselector%2Fdownload%3Fmap_name%3Dworkline_fornecedores%26organization_id%3D1 HTTP / 1.1 Принять: application / x-ms-application, image / jpeg, application / xaml + xml, image / gif, image / pjpeg, application / x-ms-xbap, application / vnd.ms-excel, application / vnd.ms-powerpoint, application / msword, application / x-shockwave-flash, / Accept-Language: Пользовательский агент PTSI: Mozilla/4.0 (совместимый; MSIE 7.0; Windows NT 6.1; WOW64; Trident/4.0; SLCC2; .NET CLR 2.0.50727; .NET CLR 3.5.30729; .NET CLR 3.0.30729; Медиа-центр ПК 6.0; InfoPath.2; MS-RTC LM 8;.NET4.0C;.NET4.0E;.NET CLR 1.1.4322) Accept-Encoding: gzip, deflate Соединение: Keep-Alive Хост: example.host Cookie: WT_FPC = ID = 2edd0fbf206582555011375854627180: LV = 1375854634144: сс = 1375854627180; _swa_uv = 527730711375858227; __utma = 163226403.1634134224.1376900542.1376900542.1376900542.1; Apache = 10.188.178.249.1416485792985658

...

Приложение

ПОЛУЧИТЕ http://example.host/authorizer/check_remote_user?url=%2Fmaps%2Fselector%2Fdownload%3Fmap_name%3Dworkline_fornecedores%26organization_id%3D1 HTTP / 1.1 хост: example.host Cookie: Apache=10.188.178.249.1416491766480034 Cache-Cache без кеша, без кеша Прагма: без кеша

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

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

1 ответ

Мне в конце концов удалось это сделать!

Я обнаружил, что при выполнении запроса с моим кодом меня перенаправили на второй URL. Этот URL-адрес исправлен, и если я попытаюсь сделать запрос на эту вторую ссылку, я смогу загрузить файл.

Все еще не могу понять, почему...

Все, что я должен был быть уверен, это иметь CookieContainer в моем WebRequest, иначе возникнет исключение "слишком много попыток автоматического перенаправления" (я полагаю, это потому, что адресат пытается установить куки).

FINAL CODE - где strURL - вторая ссылка в тексте (перенаправленная ссылка)

HttpWebRequest request;
HttpWebResponse response;

request = (HttpWebRequest)WebRequest.Create(strURL);

CredentialCache cc = new CredentialCache();
cc.Add(new Uri(strURL), "Negotiate", (
            (domain == null || domain == "") ?
            new System.Net.NetworkCredential(user, pass) :
            new System.Net.NetworkCredential(user, pass, domain)));

request.Credentials = cc;
request.CookieContainer = new CookieContainer();

response = (HttpWebResponse)request.GetResponse();
Другие вопросы по тегам