C # HTTPWebRequest против Negotiate / Basic с сайтом Realm

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

Ближе к делу ... У меня есть ссылка, по которой можно скачать 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

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

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

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

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

Тем не менее, я получал ошибку HTTP 401. Прочитав еще немного, я обнаружил, что мне, вероятно, нужно добавить 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 User-Agent: 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; Media Center PC 6.0; InfoPath.2; MS-RTC LM 8; .NET4.0C ; .NET4.0E; .NET CLR 1.1.4322) Accept-Encoding: gzip, deflate Connection: Keep-Alive Host: example.host Cookie: WT_FPC = id = 2edd0fbf206582555011375854627180: lv = 1375854634144: ss = 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: no-store, no-cache Pragma: no-cache Connection: 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- Язык: PTSI User-Agent: 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; Media Center PC 6.0; InfoPath.2; MS-RTC LM 8; .NET4.0C; .NET4.0E; .NET CLR 1.1.4322) Accept-Encoding: gzip, deflate Соединение: Keep-Alive Host: example.host Cookie: WT_FPC = id = 2edd0fbf206582555011375854627180: lv = 1375854634144: ss = 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-Control: no-store, no- cache Pragma: без кеширования

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

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


person FEST    schedule 17.11.2014    source источник


Ответы (1)


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

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

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

Все, что мне нужно было быть уверенным, это наличие CookieContainer в моем WebRequest, в противном случае будет выдано исключение «Было предпринято слишком много автоматических перенаправлений» (я считаю, что это происходит из-за того, что адресат пытается установить файлы cookie).

ОКОНЧАТЕЛЬНЫЙ КОД - где 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();
person FEST    schedule 12.12.2014
comment
Если я не хочу вводить логин и пароль? - person Eng Soon Cheah; 14.09.2020
comment
Думаю, вы можете использовать что-то вроде этого docs.microsoft.com/en-us/dotnet/api/ или вообще не устанавливайте учетные данные. Или я неправильно понимаю ваш вопрос? - person FEST; 14.09.2020
comment
Я использую этот метод, но получаю ошибку о несанкционированном доступе в iPhone Safari. у вас были какие-нибудь идеи по этому поводу? - person Eng Soon Cheah; 14.09.2020