powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Delphi [игнор отключен] [закрыт для гостей] / NTLM Kerberos аудентификация в Indy10
19 сообщений из 44, страница 2 из 2
NTLM Kerberos аудентификация в Indy10
    #35807966
Фотография Anatoly Podgoretsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
автортупым GET
тупым GET не получится, как раз админстраторы и боролись, что бы это не проходило.

--
http://www.podgoretsky.com
...
Рейтинг: 0 / 0
NTLM Kerberos аудентификация в Indy10
    #35808013
Фотография Альт
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
revda.info, капец... я дал готовое решение на инди, в разделе есть решение и на синапсе... вы загадочны...
...
Рейтинг: 0 / 0
NTLM Kerberos аудентификация в Indy10
    #35808095
revda.info
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
По вашему примеру Альт я получаю сообщение:
Could not load SSL library

не понимаю в чем тут проблема, код один к одному.
Изменены имя,порт, имя и парол


По ICS пока не нашел вменяемых данных
...
Рейтинг: 0 / 0
NTLM Kerberos аудентификация в Indy10
    #35808128
revda.info
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Слил стабильную ICS
...
Рейтинг: 0 / 0
NTLM Kerberos аудентификация в Indy10
    #35808176
Фотография Альт
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
здравствуйте... так вы еще и отладчиком пользоваться не умеете )))))) комедия... зачем вы лезете в то, что не понимаете... как это работает и зачем )))))))))))
Инди умеет пользоваться двумя типами реализаций ntlm... первая платформозависимая... SSPI пользуется виндовыми библиотеками... вторая "NTLM" универсальна и пользуется библиотеками OpenSSL (ics делает это аналогично), реализации синапса две нативная и OpenSSL.
Тут вам не сливать надо... тут азбуку надо открывать )))))))))
...
Рейтинг: 0 / 0
NTLM Kerberos аудентификация в Indy10
    #35808181
revda.info
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Знал-п дак и не совался сюда
...
Рейтинг: 0 / 0
NTLM Kerberos аудентификация в Indy10
    #35808246
revda.info
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Запрос вроде делаю в ICS, возвращается код 200, но чтобы забрать данные, какой-то изврат нужно проделать, так и не понял как забрать данные пока.
...
Рейтинг: 0 / 0
NTLM Kerberos аудентификация в Indy10
    #35808280
revda.info
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Вроде как победа.
С компонентом ICS удалось подгрузить страницу.
То что все мне долго морочили голову страшными словами вылилось буквально в 6 строк кода:

Код: plaintext
1.
2.
3.
4.
5.
6.
HTTPCli1.URL:= 'http://www.yahoo.com';
HTTPCli1.RcvdStream:= TMemoryStream.Create;
HTTPCli1.Get;
HTTPCli1.RcvdStream.Position:=  0 ;
Memo1.Lines.LoadFromStream(HTTPCli1.RcvdStream);
HTTPCli1.RcvdStream.Free;

Спасибо Анатолию, за подсказанные компоненты
...
Рейтинг: 0 / 0
NTLM Kerberos аудентификация в Indy10
    #35808348
Фотография Anatoly Podgoretsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Главный враг - это сам себе враг.

--
http://www.podgoretsky.com
...
Рейтинг: 0 / 0
NTLM Kerberos аудентификация в Indy10
    #35808721
Фотография Альт
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Поколупал ics... действительно ntlm отрабатывает первым (тут я ошибся... он у них тоже нативный, как и в синапсах), если не может отработать он, то выполняется basic... всё... в ics больше нет никаких других реализаций ) такая вот шляпа ) при чем написан обсуждаемый код с серьезными упущениями... начиная вот с этого места:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
 function  THttpCli.GetNTLMMessage1:  String ;
 begin 
     { Result := FNTLM.GetMessage1(FNTLMHost, FNTLMDomain);            } 
     { it is very common not to send domain and workstation strings on } 
     { the first message                                               } 
    Result := NtlmGetMessage1('', '');
 end ;

все, дальше домен потеряли и он уже не используется (первый параметр):
Код: plaintext
1.
2.
3.
4.
5.
        Result := NtlmGetMessage3('',
                                  Hostname,
                                  FProxyUsername,
                                  FProxyPassword,
                                  FProxyNTLMMsg2Info.Challenge)

т.е. авторизоваться, используя полное пользовательское доменное имя, нельзя... такой вот "добрый вечер"... этот код не будет работать в лесе... FIRMA1.DOMAIN.COM\USER и FIRMA2.DOMAIN.COM\USER одно лицо? ) короче... хорошо там, где нас нет ))

зы: починил SSPI модуль от инди (итого... поддерживаемый список теперь равен: Basic, Digest, Kerberos, NTLM)... файлить господам из атозет лень, зато теперь можно с авторизованной в домене машины ходить без указания юзера, тогда представляться будет текущим или указывать юзера явно с полным доменным именем:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
 program  NegotiateDemo;

 {$APPTYPE CONSOLE} 

 uses 
  SysUtils,
  IdAuthentication,
  IdAuthenticationSSPI,
  IdHTTP;

 type 
  TDummyProxy =  class 
   private 
     class   procedure  OnProxyAuthorization( Sender: TObject;
      Authentication : TIdAuthentication;  var  Handled : Boolean );
   end ;

 { TDummyProxy } 

 class   procedure  TDummyProxy.OnProxyAuthorization(Sender: TObject;
  Authentication: TIdAuthentication;  var  Handled: Boolean);
 begin 
   // ну хочет инди эту функцию, хоть и пустую ) 
 end ;

 begin 
   with  TIdHTTP.Create(  nil  )  do 
   try 
    OnProxyAuthorization := TDummyProxy.OnProxyAuthorization;
    ProxyParams.ProxyServer := '...';
    ProxyParams.ProxyPort :=  8080 ;
    ProxyParams.BasicAuthentication := false;
    HTTPOptions := HTTPOptions + [ hoInProcessAuth ];
    WriteLn( Get('http://ya.ru') );
   finally 
    Free
   end ;
 end .

красота )
...
Рейтинг: 0 / 0
NTLM Kerberos аудентификация в Indy10
    #35808902
revda.info
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
У меня задачи были очень простые - отправить строчку и принять строчку.
Мне просто интересно, ты Альт мега маньяк какой-то, зачем все это пишешь, в исходниках компонентов ковыряешься, это же время сколько надо ?
Рад что есть такие люди как вы и есть такой форум как этот. Всем спасибо.
Если ты Альт хочешь что-то предложить или сказать что Indy-починеный лучше - напиши, а то я не пойму на самом деле идеалогически какой компонент более правильный.

Спасибо еще раз
...
Рейтинг: 0 / 0
NTLM Kerberos аудентификация в Indy10
    #35809055
Фотография Anatoly Podgoretsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Идеологически правильнее ICS, но если задачи простые, линейные и потоков мало, то подойдет и Инда. Главное понимать идеологию обеих систем.

--
http://www.podgoretsky.com
...
Рейтинг: 0 / 0
NTLM Kerberos аудентификация в Indy10
    #35809082
Фотография Альт
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
revda.info, да ничего не хочу предложить. Зафиксировал результат для гугля и поиска по форуму. Идеологии Анатолия не про меня... я токарь )
...
Рейтинг: 0 / 0
NTLM Kerberos аудентификация в Indy10
    #35809116
Фотография Anatoly Podgoretsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Альтrevda.info, да ничего не хочу предложить. Зафиксировал результат для гугля и поиска по форуму. Идеологии Анатолия не про меня... я токарь )
Точишь детали на потоке, или токарь одиночка?
В первом случае Sinapse/Indi, во втором случае ICS

Токарь и Интернет вполне совместимы.
...
Рейтинг: 0 / 0
NTLM Kerberos аудентификация в Indy10
    #35809127
Фотография Альт
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Согласен ;)
...
Рейтинг: 0 / 0
Период между сообщениями больше года.
NTLM Kerberos аудентификация в Indy10
    #36736064
Alex S
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Альт...
зы: починил SSPI модуль от инди (итого... поддерживаемый список теперь равен: Basic, Digest, Kerberos, NTLM)...
Пытаюсь разобраться с авторизацией (правда не на прокси, а на сервере - но это сути не меняет) с использованием Kerberos. Нарвался на эту ветку. Пробую использовать Indy с IdAuthenticationSSPI.
NTLM работает, но нужен Kerberos. Запретил на web-сервере NTLM. Получаю от сервера:

HTTP/1.1 401 Unauthorized
Content-Length: 1656
Content-Type: text/html
Server: Microsoft-IIS/6.0
WWW-Authenticate: Negotiate
X-Powered-By: ASP.NET
Date: Mon, 12 Jul 2010 11:08:31 GMT


Я так понимаю, этот модуль (IdAuthenticationSSPI) ничего другого, кроме
Authorization: NTLM TlRMTVNTUAABAAAAB7IIogsACwA...
серверу ответить не может (судя по исходникам)
Стандартный от Delphi7 вообще не понимает одну WWW-Authenticate: Negotiate и ожидает WWW-Authenticate: NTLM

Подправленный Альтом IdAuthenticationSSPI.pas (и новые версии отсюда ) пытаются ответить серверу так-же как и при NTLM, видимо благодаря RegisterAuthenticationMethod('Negotiate', TIdSSPINTLMAuthentication); в секции initialization модуля. Но сервер, естественно это не ест и присылает точно такой-же респонд как и при первой итерации.

Поправил метод:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
 function  TIdSSPINTLMAuthentication.Authentication:  string ;
 var 
  S:  string ;
 begin 
  Result := '';
   case  FCurrentStep  of 
     1 :
       begin 
         if  Length(Username) =  0   then   begin 
          FSSPIClient.SetCredentialsAsCurrentUser;
         end   else   begin 
          FSSPIClient.SetCredentials(Domain, Username, Password);
         end ;
        Result := 'Negotiate ' + EncodeString( FSSPIClient.InitAndBuildType1Message);   {Do not translate} 
 //        Result := 'NTLM ' + EncodeString( FSSPIClient.InitAndBuildType1Message);  {Do not translate} 
        FNTLMInfo := '';     {Do not translate} 
       end ;
     2 :
       begin 
         if  Length(FNTLMInfo) =  0   then   begin 
          // FNTLMInfo := ReadAuthInfo('NTLM');  {Do not translate} 
          FNTLMInfo := ReadAuthInfo('Negotiate');   {Do not translate} 
          Fetch(FNTLMInfo);
         end ;

         if  Length(FNTLMInfo) =  0   then   begin 
          Reset;
          Abort;
         end ;

        S := DecodeString( FNTLMInfo);
 //        Result := 'NTLM ' + EncodeString( FSSPIClient.UpdateAndBuildType3Message(S));  {Do not translate} 
        Result := 'Negotiate ' + EncodeString( FSSPIClient.UpdateAndBuildType3Message(S));   {Do not translate} 
        FCurrentStep :=  3 ;
       end ;
     3 :  begin 
        FCurrentStep :=  4 ;
       end ;
   end ;
 end ;
т.е. заменил NTLM на Negotiate.
Сервер съел, выдал пакет с 200 OK.
Но "терзают смутные сомненья": а был ли тут Kerberos?
Насколько я понимаю - соединение опять прошло по NTLM. Собственно вопрос: как мне переключится на Kerberos? Или оно само включится (внутри security.dll) как только будут соблюдены какие-нибудь условия?
...
Рейтинг: 0 / 0
Период между сообщениями больше года.
NTLM Kerberos аудентификация в Indy10
    #39453145
Nashev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Alex S, ща копаюсь в той же теме.

Менять NTLM на Negotiate в этих трёх местах бессмысленно и вредно, потому как это запись и получение собственно NTLM токенов. У Вас продолжало работать потому, видимо, что не перекомпилировался исправленный Вами модуль при сборке приложения. Чтоб системный модуль перекомпилировался, нужно его ещё компилятору тем или иным способом подсунуть, а так он обычно готовые .dcu из папки lib использует.

Регистрируется этот IdAuthenticationSSPI для ещё и для Negotiate потому, что когда от сервера приходит заголовок WWW-Authenticate со словом Negotiate, это значит что сервер предполагает клиенту некоторую свободу выбора. Клиент может ответить токеном NTLM, и сервер типа станет по NTLM авторизовать. Но токеном Negotiate отвечать не нужно.

А вот готовой реализации клиента Kerberos под Delphi (и уж тем более под Indy) я пока не нашёл.
...
Рейтинг: 0 / 0
NTLM Kerberos аудентификация в Indy10
    #39454811
Nashev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Хм.. Однако, наврал.

На текущий момент, когда у меня заработал Kerberos и Negotiate под Indy 10 через SSPI, я понимаю ситуацию так:

Если сервер предлагает авторизацию методом 'Negotiate', то отвечать нужно токенами со словом 'Negotiate'. Правда, получать такие токены нужно после передачи в AcquireCredentialsHandleW в качестве PackageName тоже имени 'Negotiate' Он будет немножко другой текст токенам делать. Аналогично с Kerberos-ом: пакет нужно указать 'Kerberos', и перед токенами писать 'Kerberos'. В общем, что прислали с сервера - то и продолжаем приписывать.

В отличие от NTLM, Kerberos требует, чтоб ему при первом обращении к InitializeSecurityContextW в InitAndBuildType1Message аргументом pszTargetName передать не nil или пустую строку, а SPN (service principal name, см. https://msdn.microsoft.com/en-us/library/ms677949(v=vs.85).aspx). Его довольно часто можно собрать из URL, взяв хост и приписав к нему, например, 'HTTP/'.

Если Negotiate в аналогичных условиях передать SPN, он может для формирования токенов выбрать алгоритм Kerberos, а если не передать - то точно выберет NTLM ( https://msdn.microsoft.com/en-us/library/ee498156.aspx).

Итого, чтоб всё это завелось, пришлось
1) добавить в конструктор класса аутентификации аргумент MethodName, и прокидывать в него значение из IdHTTP.pas при вызовах после поиска посредством FindAuthClass. При создании объекта пакета в TIndySSPIClient.Create стал вместо конечного наследника с зашитым именем создавать его родительский класс, с передачей в конструктор этого имени метода в качестве имени пакета. В спецификацию обработчика TIdOnSelectAuthorization пришлось тоже добавить имя метода.
1.1) попутно заметил, что вызовы LAuth.AuthParams := лучше б делать перед вызовами метода Authentication у этого объекта, чтоб Authentication мог потенциально опираться на актуальные сведения. Правда, собственно опираться не понадобилось пока.
2) добавить в TIdSSPINTLMAuthentication обработчик SetRequest, и поменять ему в базовом классе AUri со string на TIdURI, чтоб таки передавал хост. А то был только путь на сервере.
3) добавить регистрацию этого класса ещё и для метода MICROSOFT_KERBEROS_NAME (эта константа объявлена в c:\program files (x86)\embarcadero\studio\18.0\source\Indy10\Protocols\IdSSPI.pas)

Затем, уже в косметических целях, повыкидывал NTLM из имён вида TIdSSPINTLMAuthentication (чтоб было, в этом примере, TIdSSPIAuthentication), заменил fNTLMInfo на fSPPIInfo, добавил TIdSSPIAuthentication.SetServicePrincipalName для возможности установки более специфических SPN, поменял местами имена у TSSPIPackage и TCustomSSPIPackage, чтоб Custom было приписано у класса-предка, а не у того класса, экземпляр которого в итоге создаётся, и убил более не нужный класс TSSPINTLMPackage, инкапсулировавший лишь инициализацию родительского класса константой с именем пакета.

В общем, после этого у меня программа авторизовалась в режиме SSO по протоколу Negotiate.

Изменённые файлы прикладываю.
...
Рейтинг: 0 / 0
NTLM Kerberos аудентификация в Indy10
    #39575237
Zelius
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Nashev,

А на какой версии инди основано ваше решение?
никак не могу завести NTLM для Get запросов, примеров в инете маловато, прямо скажем.
...
Рейтинг: 0 / 0
19 сообщений из 44, страница 2 из 2
Форумы / Delphi [игнор отключен] [закрыт для гостей] / NTLM Kerberos аудентификация в Indy10
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]