Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 2014.02.09;
Скачать: [xml.tar.bz2];

Вниз

NTLM-аутентификация   Найти похожие ветки 

 
И. Павел ©   (2013-04-09 12:48) [0]

Здравствуйте.

Пытаюсь пройти NTLM аутентификацию через idHttp:

1. Устанавливаю idHttp.HTTPOptions.hoInProcessAuth = true и HandleRedirects = true

2. Добавляю обработчики событий idHTTP:

procedure TForm1.IdHTTPAuthorization(Sender: TObject;
 Authentication: TIdAuthentication; var Handled: Boolean);
begin
 Authentication.Reset;
 Authentication.Username := "user";
 Authentication.Password := "password";
 Handled := true;
end;

procedure TForm1.IdHTTPSelectAuthorization(Sender: TObject;
 var AuthenticationClass: TIdAuthenticationClass; AuthInfo: TIdHeaderList);
begin
 AuthenticationClass := TIdNTLMAuthentication;
end;


3. Обращаюсь к закрытой странице:

   IdHTTP.Get("http://hd-test.ds.local:8080/...");

Если обратиться к ней через браузер и смотреть заголовки, то начинается процесс аутентификации — клиент и сервер в несколько ступеней обмениваются заголовками, после чего доступ к нужной странице открывается.

Но через IdHttp аутентификация не начинается и возвращается страница: <HTML>/ntlmv2</HTML> (плюс сессия через куки).

Перехожу к /ntlmv2 (т.к. в браузере этот переход тоже выполняется, вдруг после него начнется ntlm аутентификация):

IdHTTP.Get("http://hd-test.ds.local:8080/tlmv2");

При этом вызываются обработчики IdHTTPAuthorization и IdHTTPSelectAuthorization, но после этого где-то в недрах инди генерируется исключение EAbort...

Может быть кто-то уже с этим сталкивался.
Подскажите, пожалуйста, как пройти ntlm-аутентификацию.


 
Медвежонок Пятачок ©   (2013-04-09 13:04) [1]

xmlhttprequest


 
И. Павел ©   (2013-04-09 15:02) [2]

> [1] Медвежонок Пятачок ©   (09.04.13 13:04)

NTML логин и пароль писать в аргементах функции open?
Вот так не получается:

procedure TForm1.Button2Click(Sender: TObject);
var xmlHttpReq : OleVariant;
begin
 try
   xmlHttpReq := GetActiveOleObject("Microsoft.XMLHTTP");
 except
   xmlHttpReq:=CreateOleObject("Microsoft.XMLHTTP");
 end;
 xmlHttpReq.open("get", "http://hd-test.ds.local:8080/...", false, "mylogin", "mypassword");
 xmlHttpReq.send();
 Memo1.Text := xmlHttpReq.responseText;
end;


При запросе страницы возвращает страницу со скриптом:

<script>location.href="/ntlmv2";</script>

А при обращении к странице /ntlmv2 выкидывает на страницу авторизации. А с ней уже другая проблема: invalid direct reference to form logon page...


 
Медвежонок Пятачок ©   (2013-04-09 16:18) [3]

по идее вообще ничего не надо вводить.
все должно быть прозрачно.


 
DVM ©   (2013-04-09 17:52) [4]


> И. Павел ©   (09.04.13 12:48) 

возьми снифер и погляди в чем отличие браузера и tidhttp


 
И. Павел ©   (2013-04-10 08:19) [5]

> [4] DVM ©   (09.04.13 17:52)

Если отсылать то же, что и браузер через idHttp, то при запроса ресурса /ntlm2 отрабатывает IdHTTPSelectAuthorization и где-то внутри инди вылетает EAbort (при этом обработчик IdHTTPAuthorization даже не вызывается). Trace Into сделать не получается...

А в браузере в ответ на запрос к ntlm2 приходит ответ с заголовком &laquo;WWW-Authenticate: NTLM&raquo; и начинается аутентификация.


 
И. Павел ©   (2013-04-10 08:22) [6]

> при запроса ресурса

при запросе ресурса


 
знайка   (2013-04-10 09:03) [7]

IdNTLMAuthentication подключен?


 
И. Павел ©   (2013-04-10 09:37) [8]


> [7] знайка   (10.04.13 09:03)

Да, в uses есть IdAuthenticationNTLM.


 
знайка   (2013-04-10 10:27) [9]

не этот ли аборт у вас срабатывает http://www.delphifaq.ru/indy-protocols-source-part1/idauthenticationntlm.html ?


 
И. Павел ©   (2013-04-10 11:53) [10]

> [9] знайка   (10.04.13 10:27)

Спасибо. Похоже, дело было в этом. В Delphi 7 вызов IdSSLOpenSSLHeaders.Load возвращал false. Похоже, для старого indy нужна старая версия библиотеки openssl.
Подобрать для него ibeay32.dll и ssleay32.dll не получилось, но новый indy в XE нормально работает с новыми ibeay32.dll и ssleay32.dll (по крайней мере IdSSLOpenSSLHeaders.Load = true).
Тут уже возникает другая ошибка: 401 unauthorized... Причем обработчик IdHTTPAuthorization даже не вызывается.


 
знайка   (2013-04-10 12:13) [11]


> А при обращении к странице /ntlmv2 выкидывает на страницу
> авторизации. А с ней уже другая проблема: invalid direct
> reference to form logon page...
а тут я полагаю, реферер надо указать правильный


 
И. Павел ©   (2013-04-10 13:01) [12]

> [11] знайка   (10.04.13 12:13)

Пытался добавлять заголовок referrer &#151; он его игнорирует. Еще в сети вычитал предположение, что дело в том, что где-то на стороне сервера запоминается страница, с которой произошел переход на страницу авторизации. Но и предварительное открытие главной страницы не помогло (хотя куки у idHTTP включены и сессия через них передается). Да и браузер прекрасно открывает страницу логина первой. В общем &#151; не сайт а танк &#151; никак не удается подступиться :)

Это программа service desk plus. Может быть кто-то уже пробовал залогиниться в ней?


 
DVM ©   (2013-04-10 22:00) [13]


> И. Павел ©   (10.04.13 11:53) [10]


> В Delphi 7 вызов IdSSLOpenSSLHeaders.Load возвращал false.
>  Похоже, для старого indy нужна старая версия библиотеки
> openssl.
> Подобрать для него ibeay32.dll и ssleay32.dll не получилось,
>  но новый indy в XE нормально работает с новыми ibeay32.
> dll и ssleay32.dll

Так может в старый Delphi установить новый Indy?


 
DVM ©   (2013-04-10 22:09) [14]


> И. Павел ©   (10.04.13 13:01) [12]

Так я не понял, ты смотрел Wireshark-ом что шлет браузер? У тебя случайно прокси не используется в браузере?


 
И. Павел ©   (2013-04-11 15:48) [15]

> Так может в старый Delphi установить новый Indy?

Попробую. Хотя в XE уже стоит новый, но возникает другая ошибка &#151; 401 unauthorized. Скорее всего после установки нового Indy в Delphi7 вылетит эта же ошибка.


> У тебя случайно прокси не используется в браузере?

Прокси используется для внешних узлов. А тот сайт, к которому обращаюсь я находится в локальной сети. Через прокси он вообще не доступен.


> Так я не понял, ты смотрел Wireshark-ом что шлет браузер?

Я смотрел заголовки через ieHTTPHeaders. Сначала запрашивается корневая стрнаица. Вместо нее возвращается страница со скриптом, осуществляющим переход к странице /ntlmv2 а дальше начинается аутентификация. Вот заголовки этого процесса: http://codepaste.ru/14046/ . А Indy у меня аутентификацию не начинает, а останавливается на ошибке 401 unauthorized. Я пытался вручную передавать серверу заголовок начала рукопожатия:

Authorization: NTLM TlRMTVNTUAAB...

В ответ приходит

WWW-Authenticate: NTLM TlRMTVNTUA...

И Indy опять не хочет продолжать аутентификацию автоматически. Не вручную же искать кодовое слово в строке &laquo;WWW-Authenticate:&raquo; и на основе его делать хеши паролей двумя способами (тем более что, кажется, NTLM не полностью документирован)...
Пока остановился на использовании компонента TWebBrowser, но он громоздкий и управлять через него сайтом неудобно.


 
DVM ©   (2013-04-11 16:52) [16]


> И. Павел ©   (11.04.13 15:48) [15]


> Вместо нее возвращается страница со скриптом, осуществляющим
> переход к странице /ntlmv2 а дальше начинается аутентификация.
>

А ну все тогда понятно, скрипт то некому выполнять, следовательно редирект на /ntlmv2 выполнить некому. Скорее всего, это не просто редирект, а с генерацией скриптом и установкой каких нибудь куков, которые ждут на /ntlmv2. TIdHTTP разумеется не умеет выполнять скрипты и ничего не работает.
Я таких сайтов видел тьму. Почти все сайты сотовых операторов, сбера, и т.д и т.п. так делают.  Продраться сквозь скрипты весьма сложно.

Можно конечно проанализировать что делает тот скрипт и посмотреть, нельзя ли генерировать все точно так же как он но на Delphi.


 
знайка   (2013-04-11 17:37) [17]


> DVM ©   (11.04.13 16:52) [16]
в  [2] показан скрипт, а [16] - "куки у idHTTP включены и сессия через них передается", хотя конечно может И. Павел не то имеет ввиду ...

> И. Павел ©   (11.04.13 15:48) [15]
посмотрите в хидерах что гоняется по кукам


 
знайка   (2013-04-11 17:38) [18]

или покажите тут все хидеры


 
DVM ©   (2013-04-11 17:58) [19]


> знайка   (11.04.13 17:37) [17]


> в  [2] показан скрипт

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


> а [16] - "куки у idHTTP включены и сессия через них передается

Да будь они хоть трижды включены, если JavaScript на предыдущей странице не отработал (а как он отработает то без браузера), то среди параметров запроса может отсутствовать какой либо значимый для /ntlmv2 параметр (или в куке он), соответственно дальше ничего не работает.


 
знайка   (2013-04-11 18:29) [20]

главное чтобы запросы были с точки зрения сервера правильные, а уж скрипт его или еще кто - 25 дело


 
И. Павел ©   (2013-04-12 13:33) [21]

Решил проблему. Я сам себе оказался злым буратино: прописал AuthenticationClass := TIdNTLMAuthentication (а у этого класса даже поля домена нет). Можно было не прописывать ничего или указать TIdSSPINTLMAuthentication.
Плюс запутался в двух аутентификациях &#151; ntml и сайта. Они шли независимо и sso проходил только при открытии сайта браузером, а через idhttp пришлось авторизоваться сначала по ntlm а потом на сайте.

Всем спасибо!
(DVM © &#151; отдельное спасибо за упоминания про wireshark &#151; очень удобная вещь.)



Страницы: 1 вся ветка

Форум: "Начинающим";
Текущий архив: 2014.02.09;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.51 MB
Время: 0.003 c
15-1377241940
Павиа
2013-08-23 11:12
2014.02.09
Успешный пуск ракеты.


2-1365575576
Abcdef123
2013-04-10 10:32
2014.02.09
TDataSet.Как оптимально скопировать всего одну запись в новый.


2-1365140334
alexdn
2013-04-05 09:38
2014.02.09
Прорисовка в paintbox


15-1377535265
robt5
2013-08-26 20:41
2014.02.09
FTP клиенты


15-1377527842
Дальний Восток
2013-08-26 18:37
2014.02.09
Наводнение на Дальнем Востоке





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский