Indy Idhttp ile ISA Server NTLM Proxy aşmak...

Delphi'de kod yazma ile ilgili sorularınızı bu foruma yazabilirsiniz.
Cevapla
Kullanıcı avatarı
mrmarman
Üye
Mesajlar: 4741
Kayıt: 09 Ara 2003 08:13
Konum: İstanbul
İletişim:

Indy Idhttp ile ISA Server NTLM Proxy aşmak...

Mesaj gönderen mrmarman »

Selam..

- Indy 10 kullanıyorum.. Çalıştığım kurumda ISA Server altında Proxy destekli çıkış imkanı verilmektedir.

- Her Internet Explorer açılıp da kurum dışındaki bir web sunucusuna çağrı yapıldığında ( örneğin google ) bizden Kullanıcı Adı ve Parola girmemizi isteyen giriş ekranı geliyor. Hatta Adımızı girerken başına domain olarak kurum domainini girip ters slash ile ismimizi girerek kabul ediliyoruz.

Kod: Tümünü seç

Name     : trt\muharrem.arman
Password : parola
- Kullandığımız bilgisayarlarda kurulu olan mevcut windows işletim sistemleri "Professional edition" olmadığından isim ve parola girişleri asla kaydedilimiyor. Aynı browser penceresinden yeni pencereler türetirsek tekrar şifre girmeye lüzum kalmıyor olsa da yeni bir explorer penceresini hiç yokken açmışsak domain\isim parolayı tekrar girmek gerekiyor.

- Servisimize özel bazı özel WEB sorgularını (borsa, hava durumu, uçak tarifeleri, yol durumu vb. derleme yapan bir yazılımdır.) (WebBrowser kullanmaksızın) Indy ile yapmak istesim. Tabi NTLM proxy Authentication olayında takıldım. Ne yaptıysam

Kod: Tümünü seç

Proxy Authentication required - The ISA Server requires authorization to fulfill the request.
hatasını içeren HTML sonucunu aşamadım.

Buraya başlık açmadan evvel incelediğim adresler :
:arrow: http://www.isaserver.org/tutorials/Trou ... ssues.html

:arrow: http://www.isaserver.org/tutorials/forw ... cauth.html

- Bu konuda tecrübesi olanlardan bildikleri veya refere edecekleri siteleri bildirirlerse sevinirim.

- Teşekkürler...
Resim
Resim ....Resim
Kullanıcı avatarı
fatihtolgaata
Üye
Mesajlar: 382
Kayıt: 04 Mar 2004 09:46
Konum: K.çekmece / İstanbul
İletişim:

Mesaj gönderen fatihtolgaata »

TIdProxyConnectionInfo yerine TIdHTTP kullanmayı deneyin. BasicAuthentication olması gerek, olmuyorsa, NTLM kullanamayı deneyin. BasicAuthentication için:

Kod: Tümünü seç

    idHTTP1.proxyParams.BasicAuthentication := True;
    idHTTP1.proxyParams.ProxyServer := '10.0.0.1';
    idHTTP1.proxyParams.ProxyPort := 4545;
    idHTTP1.proxyParams.ProxyUsername := 'kkkk';
    idHTTP1.proxyParams.ProxyPassword := 'şşşş';
gibi bir şey deneyin. Ardından önemli nokta "OnProxyAuthorization" olayını:

Kod: Tümünü seç

procedure TForm1.IdHTTP1ProxyAuthorization(Sender: TObject;
  Authentication: TIdAuthentication; var Handled: Boolean);
begin
    Authentication.Password := ProxySifresi;
    Authentication.Username := ProxyKullaniciAdi;
    idHTTP1.ProxyParams.BasicAuthentication := True;
    Handled := True;
end;
gibi bir şey yapın. Olması gerek. Olmazsa NTLM denenebilir. Ama hiç NTLM ile uğraşmadım. Bizde de ISA Server vardı. Şu an yok deneyemiyorum. Ama yukardaki gibi bir şey işe yarıyordu.
Yarından sonra da 2-3 hafta kadar bilgisayar ve internetten uzağım. Bu yüzden cevap veremeyebilirim. İngilizcen varsa codegear'ın newsgrouplarına da danışabilirsin.

Kolay gele.
Kullanıcı avatarı
mrmarman
Üye
Mesajlar: 4741
Kayıt: 09 Ara 2003 08:13
Konum: İstanbul
İletişim:

Mesaj gönderen mrmarman »

Hocam, zaten örneklediğin şekilde denemiştim.

- BasicAuth ile ADSL modemlerin consollarına girmişliğim tecrübe etmişliğim var, onları ve benzerini denedim. Olmuyor malesef.

- NTLM konusunda bayağı bir internet taraması yaptım ama sadece sistematik bilgi bulabildim. Indy ile ilgili bulduğum örneklerse uygulamada sonuçsuz kaldılar.

En son yakaladım dediğim örnek aşağıdaki gibiydi ama sonuç vermedi :

Kod: Tümünü seç

procedure TForm1.Button1Click(Sender: TObject);
Var
  Sonuc : String;
begin
  //hInet := InternetOpen(PChar(Agent), INTERNET_OPEN_TYPE_PROXY or INTERNET_OPEN_TYPE_PRECONFIG, nil, nil, 0);

  idHTTP.HTTPOptions := [hoInProcessAuth, hoForceEncodeParams];
  IdHTTP.ProxyParams.ProxyServer   := 'proxy';
  IdHTTP.ProxyParams.ProxyPort     := 80;
  IdHTTP.ProxyParams.ProxyUsername := 'trt\muharrem.arman';
  IdHTTP.ProxyParams.ProxyPassword := 'parola';
  //IdHTTP.Request.BasicAuthentication := true;
  //IdHTTP.Request.Username := 'trt\muharrem.arman';
  //IdHTTP.Request.Password := 'parola';
  Try
    Sonuc := IdHttp.Get('http://www.google.com.tr');
    With TStringList.Create do begin
      Text := Sonuc;
      SaveToFile(ExtractFilePath(Application.Exename) + 'Gelen.HTM' );
      Free;
    end;
  Except
    ShowMessage('Olmadı');
  End;
end;

Kod: Tümünü seç

procedure TForm1.IdHTTPSelectProxyAuthorization(Sender: TObject;
  var AuthenticationClass: TIdAuthenticationClass; AuthInfo: TIdHeaderList);
begin
// Uses IdAuthentication, IdHeaderList, IdAuthenticationNTLM, IdAuthenticationDigest
  if ( pos('Proxy-Authenticate: NTLM', IdHTTP.Response.RawHeaders.Text) > 0) then
  begin
    Memo1.Lines.Add('Proxy type is Proxy-Authenticate NTLM:'
      +FormatDateTime('dd/mm/yyyy hh:mm:ss',now));
    IdHTTP.ProxyParams.Clear;
    IdHTTP.ProxyParams.BasicAuthentication := false;
    AuthenticationClass := TIdNTLMAuthentication;
  end else begin
  // Next check for Basic
    if (pos('Proxy-Authenticate: Basic',IdHTTP.Response.RawHeaders.Text) > 0) then
    begin
      Memo1.Lines.Add('Proxy type is Proxy-Authenticate BASIC:'
        +FormatDateTime('dd/mm/yyyy hh:mm:ss',now));
      AuthenticationClass := TIdBasicAuthentication;
      IdHTTP.ProxyParams.BasicAuthentication := true;
    end else begin
  // Then Digest
      Memo1.Lines.Add('Proxy type is Proxy-Authenticate Digest:'
        +FormatDateTime('dd/mm/yyyy hh:mm:ss',now));
      if (pos('Proxy-Authenticate: Digest',IdHTTP.Response.RawHeaders.Text) > 0)
      then AuthenticationClass := TIdDigestAuthentication;
    end;
  end;
end;
Resim
Resim ....Resim
Kullanıcı avatarı
fatihtolgaata
Üye
Mesajlar: 382
Kayıt: 04 Mar 2004 09:46
Konum: K.çekmece / İstanbul
İletişim:

Mesaj gönderen fatihtolgaata »

Şuan vaktim yok. Ayrıca 2-3 hafta sonra ancak internete kavuşabileceğim. Aslında benim yardım için yapabileceğim tek şey borland.public.delphi.internet.winsock gurubuna danışmak olacaktır. Çünkü sendeki ISA server ortamı ve ayarları bende olmadığı için ne denesem boş olur. Tabi bu gruba girmeyeli baya oldu. ismi değişmiş olabilir.
Kolay gelsin.
vesselam.
Kullanıcı avatarı
mrmarman
Üye
Mesajlar: 4741
Kayıt: 09 Ara 2003 08:13
Konum: İstanbul
İletişim:

Mesaj gönderen mrmarman »

Ben de şimdi news foruma üye olup daha önce açılmış threadlere bakayım, belki yardımcı olacak bişeyler bulurum...

news://newsgroups.borland.com/borland.public.delphi.internet.winsock

Süre olarak sorun değil, çünkü ben de yıllık izindeyim. Ay sonuna kadar kuruma gitmeyeceğimden denemelerimi projelendirip oradaki arakadaşlara MSN ile gönderip alarak yapıyordum ara veririm.

Teşekkürler...
Resim
Resim ....Resim
fduman
Moderator
Mesajlar: 2749
Kayıt: 17 Ara 2004 12:02
Konum: Ankara

Mesaj gönderen fduman »

Delphi için hazır bildiğim bir NTLM auth. implementasyonu maalesef yok. Ancak bir workaround önerebilirim.

http://ntlmaps.sourceforge.net/

adresinde, Python ile yazılmış bir proxy var. Yaptığı iş senin yerine NTLM authentication yapmak.

Kullanımı şöyle. Proxy'nin ayar dosyasında, kullanıcı adı, domain ve parolanı belirtip, localde hangi portu kullanacağını da yazdıktan sonra çalıştırıyorsun.

Indy ile yerelde çalıştırdığın bu proxy'yi proxy sunucu olarak gösteriyorsun,
socket bağlantı isteği NTLM proxy ye geliyor, senin için gerekli auth. ISA proxy ile arasında yapıldıktan sonra veri akışı başlıyor.

Benim işimi gayet iyi görmüştü. Umarım senin işine de yarar.

Kolay gelsin.
Kullanıcı avatarı
mrmarman
Üye
Mesajlar: 4741
Kayıt: 09 Ara 2003 08:13
Konum: İstanbul
İletişim:

Mesaj gönderen mrmarman »

- Bizim client'lara phyton kurma imkanım olmayacağından deneme şansım yok.
System requirements:
Python language interpreter version 1.5.2 or higher. See http://www.python.org.
- Diğer yandan bilgi için teşekkürler bu da bir fikir... Windows altında çalışan alternatif ara-proxy sunucusu örneği aramak aklıma gelmemişti.

- Bu arada Torry'de daha önce gözümden kaçmış olan bir VCL buldum onu da inceliycem...


NTLM Authentication Messages v.1.0 yazdı:NTLM Authentication Messages v.1.0 FWS 8 k 30 Oct 2002
By Diego Ariel Degese.

NTLM Class Authentication. This class is very simple, it has 3 Methods: GetMessage1, GetMessage2 and GetMessage3.

GetMessage1 is the first message with the host and domain name
GetMessage2 returns a TNTLM_Message2 with Nonce string
GetMessage3 is the last message with Host, Domain, User, LM_Hash and NT_Hash.
Resim
Resim ....Resim
Cevapla