Форум: "Начинающим";
Текущий архив: 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 приходит ответ с заголовком «WWW-Authenticate: NTLM» и начинается аутентификация.
← →
И. Павел © (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 — он его игнорирует. Еще в сети вычитал предположение, что дело в том, что где-то на стороне сервера запоминается страница, с которой произошел переход на страницу авторизации. Но и предварительное открытие главной страницы не помогло (хотя куки у idHTTP включены и сессия через них передается). Да и браузер прекрасно открывает страницу логина первой. В общем — не сайт а танк — никак не удается подступиться :)
Это программа 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 уже стоит новый, но возникает другая ошибка — 401 unauthorized. Скорее всего после установки нового Indy в Delphi7 вылетит эта же ошибка.
> У тебя случайно прокси не используется в браузере?
Прокси используется для внешних узлов. А тот сайт, к которому обращаюсь я находится в локальной сети. Через прокси он вообще не доступен.
> Так я не понял, ты смотрел Wireshark-ом что шлет браузер?
Я смотрел заголовки через ieHTTPHeaders. Сначала запрашивается корневая стрнаица. Вместо нее возвращается страница со скриптом, осуществляющим переход к странице /ntlmv2 а дальше начинается аутентификация. Вот заголовки этого процесса: http://codepaste.ru/14046/ . А Indy у меня аутентификацию не начинает, а останавливается на ошибке 401 unauthorized. Я пытался вручную передавать серверу заголовок начала рукопожатия:
Authorization: NTLM TlRMTVNTUAAB...
В ответ приходит
WWW-Authenticate: NTLM TlRMTVNTUA...
И Indy опять не хочет продолжать аутентификацию автоматически. Не вручную же искать кодовое слово в строке «WWW-Authenticate:» и на основе его делать хеши паролей двумя способами (тем более что, кажется, 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.
Плюс запутался в двух аутентификациях — ntml и сайта. Они шли независимо и sso проходил только при открытии сайта браузером, а через idhttp пришлось авторизоваться сначала по ntlm а потом на сайте.
Всем спасибо!
(DVM © — отдельное спасибо за упоминания про wireshark — очень удобная вещь.)
Страницы: 1 вся ветка
Форум: "Начинающим";
Текущий архив: 2014.02.09;
Скачать: [xml.tar.bz2];
Память: 0.51 MB
Время: 0.003 c