AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Netzwerke Anmelden an Webmodul über IdHTTP

Anmelden an Webmodul über IdHTTP

Ein Thema von fwn · begonnen am 8. Apr 2013 · letzter Beitrag vom 11. Apr 2013
Antwort Antwort
Thom

Registriert seit: 19. Mai 2006
570 Beiträge
 
Delphi XE3 Professional
 
#1

AW: Anmelden an Webmodul über IdHTTP

  Alt 9. Apr 2013, 15:47
Ich hatte das vorhin mit einer Kombination aus einem Programm mit TIdHTTP (Delphi XE3) und einer 64Bit-ISAPI-DLL (Delphi XE2) auf einem Windows Server 2008 ausprobiert:

Server:
Delphi-Quellcode:
procedure TWebModule1.WebModule1TestAction(Sender: TObject; Request: TWebRequest; Response: TWebResponse; var Handled: Boolean);
var
  N: Integer;
  S: String;
begin
  S := Request.Authorization;
  N := Pos(' ',s);
  if N > 0 then
  begin
    Delete(S,1,n);
    S := TIdDecoderMIME.DecodeString(S);
    N := Pos(':',S);
    if N > 0 then
    begin
      Response.Content:=Format('Username: %s'+sLineBreak+'Password: %s',[Copy(S,1,N-1),Copy(S,N+1,Length(S)-N+1)]);
      Exit;
    end;
  end;
  Response.Content:='Error';
end;
Klient:
Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
var
  HTTP: TIdHTTP;
begin
  HTTP := TIdHTTP.Create;
  try
    HTTP.Request.BasicAuthentication := True;
    HTTP.HandleRedirects := True;
    HTTP.Request.Username := Edit1.Text;
    HTTP.Request.Password := Edit2.Text;
    Memo1.Lines.Text := HTTP.Get('http://maps4delphi.com/test');
  finally
    HTTP.Free;
  end;
end;
Client.png

Hinweis: Der Link zum Server ist nur temporär gültig.

@mjustin:
Hatte ich nicht genau das beschrieben!?
Thomas Nitzschke
Google Maps mit Delphi
  Mit Zitat antworten Zitat
nahpets
(Gast)

n/a Beiträge
 
#2

AW: Anmelden an Webmodul über IdHTTP

  Alt 9. Apr 2013, 16:44
Hallo,

jetzt fange ich (hoffentlich) an, das Problem zu verstehen (oder eher zu erahnen).

Wenn Client und WebModul mit Indy... erstellt wurden scheint das Verhalten anders zu sein, als bei einer Nutzung von Browser und Webmodul.

Hab' eben mal 'ne Isapi.dll geschrieben, aber (bisher) vom Browser dort keine Anmeldeinformationen erhalten. Auch dann nicht, wenn ich den Webserver so konfiguriere, dass er eine Anmeldung verlangt.

Der Browser zeigt mir dann den Anmeldedialog an und fragt nach Benutzername und Passwort. Der Webserver protokolliert die erfolgreiche Anmeldung, aber in der Isapi.dll kann ich davon nichts finden.

Wenn ich die von Thom geschriebenen Quelltexte nutzte, sowohl in einem neuen Client, als auch in einer neuen ISAPI.dll, so bekomme ich von seiner Seite die Anmeldeinformationen geliefert. In einer mit Delphi 7 erstellten ISAPI.dll bekomme ich bei 1:1 übernommenem Quelltext gegen meinen eigenen Webserver keine Benutzerinformationen. Mein Webserver protokolliert aber die Anmeldedaten, muss sie von daher also kennen. Bei ungültigen Anmeldedaten gibt er den Fehler 401 zurück.

Sollte hier die Funktionalität abhängig von der Delphiversion sein oder vom Webserver?

Das wäre sehr ärgerlich

@Thom

Wie kann ich per Browser von Deiner Seite eine Antwort <> Error erhalten?

Mit Firefox ist theoretisch eine Anmeldung in der Form möglich:
Code:
http://peter:paul@maps4delphi.com/test
Diese funktioniert bei Deiner Seite jedoch nicht, daher gehe ich davon aus, dass die Anmeldeinformationen nicht in der ISAPI.Dll ankommen.

Aber das lenkt jetzt von eigentlichen Problem ab.
  Mit Zitat antworten Zitat
Thom

Registriert seit: 19. Mai 2006
570 Beiträge
 
Delphi XE3 Professional
 
#3

AW: Anmelden an Webmodul über IdHTTP

  Alt 9. Apr 2013, 19:41
Hallo nahpets,

ich hatte gerade noch etwas den Quelltext überarbeitet:

Server:
Delphi-Quellcode:
procedure TWebModule1.WebModule1TestAction(Sender: TObject; Request: TWebRequest; Response: TWebResponse; var Handled: Boolean);
var
  N: Integer;
  S: String;
begin
  S := String(Request.Authorization);
  N := Pos(' ',S);
  if N > 0 then
  begin
    Delete(S,1,N);
    S := TIdDecoderMIME.DecodeString(s);
    N := Pos(':',S);
    if N > 0 then
    begin
      Response.Content:=Format('Username: %s<br>Password: %s',[Copy(S,1,N-1),Copy(S,N+1,Length(S)-N+1)]);
      Exit;
    end;
  end;
  Response.WWWAuthenticate := 'Basic';
  Response.StatusCode := 401;
end;
Klient:
Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
var
  HTTP: TIdHTTP;
begin
  HTTP := TIdHTTP.Create;
  try
    HTTP.Request.BasicAuthentication := True;
    HTTP.HandleRedirects := True;
    HTTP.Request.Username := Edit1.Text;
    HTTP.Request.Password := Edit2.Text;
    Memo1.Lines.Text := StringReplace(HTTP.Get('http://maps4delphi.com/test'),'<br>',sLineBreak,[rfReplaceAll]);
  finally
    HTTP.Free;
  end;
end;
Damit reagiert der Server auch auf Browseranfragen (getestet mit IE9, IE10, Firefox und Google Chrome). Hier erscheint dann wegen des Statuscodes 401 der Eingabedialog für Name und Passwort.
Da ich den Zeilenumbruch in ein "<br>"-Tag umgewandelt habe, wird die Serverantwort auch korrekt im Browser angezeigt. Für die Anzeige im Delphi-Programm wird der Zeilenumbruch durch StringReplace umgewandelt.

Die Übergabe per "Name:Passwort@xyz" funktioniert nicht.

Unter Delphi 7 könnte es eventuell noch Probleme mit der Eigenschaft Request.Authorization geben. Das kann ich momentan leider nicht testen. Du könntest aber mal versuchen, diesen Wert direkt abzufragen:
Request.GetFieldByName('Authorization');

P.S.:
Das Ganze funktioniert natürlich auch über HTTPS (wegen Basic-Authentifikation = unsicher):
Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
var
  HTTP: TIdHTTP;
  SSL: TIdSSLIOHandlerSocketOpenSSL;
begin
  HTTP := TIdHTTP.Create;
  try
    SSL := TIdSSLIOHandlerSocketOpenSSL.Create;
    try
      HTTP.IOHandler := SSL;
      HTTP.Request.BasicAuthentication := True;
      HTTP.HandleRedirects := True;
      HTTP.Request.Username := Edit1.Text;
      HTTP.Request.Password := Edit2.Text;
      Memo1.Lines.Text := StringReplace(HTTP.Get('https://maps4delphi.com/test'),'<br>',sLineBreak,[rfReplaceAll]);
    finally
      SSL.Free;
    end;
  finally
    HTTP.Free;
  end;
end;
Thomas Nitzschke
Google Maps mit Delphi

Geändert von Thom ( 9. Apr 2013 um 20:19 Uhr)
  Mit Zitat antworten Zitat
nahpets
(Gast)

n/a Beiträge
 
#4

AW: Anmelden an Webmodul über IdHTTP

  Alt 9. Apr 2013, 23:22
Hallo Thom,

Code:
http://username:password@maps4delphi.com/test
funktioniert mit dem Firefox, der IE unterstützt dies nicht.

Request.GetFieldByName('Authorization') liefert mir unter Delphi 7 keinen Wert. Da könnte also ein versionsabhängiges Problem vorliegen.
  Mit Zitat antworten Zitat
Thom

Registriert seit: 19. Mai 2006
570 Beiträge
 
Delphi XE3 Professional
 
#5

AW: Anmelden an Webmodul über IdHTTP

  Alt 10. Apr 2013, 01:00
Hallo Stephan,

wieder was dazu gelernt - danke! Mit dem Feuerfuchs funktioniert das tatsächlich.

Ich werde morgen (oder besser: heute) mal Delphi 7 auf dem Server installieren und die Sache testen. Vielleicht finden wir ja die Ursache für das Problem...
Thomas Nitzschke
Google Maps mit Delphi
  Mit Zitat antworten Zitat
nahpets
(Gast)

n/a Beiträge
 
#6

AW: Anmelden an Webmodul über IdHTTP

  Alt 10. Apr 2013, 12:25
Hallo,

habe mal "weiter gedaddelt"

In meinem (mit Delphi 7 geschriebenen) Webserver kann ich die Anmeldedaten in RequestInfo.AuthUsername und RequestInfo.AuthPassword finden.

RequestInfo ist vom Typ TIdHTTPRequestInfo abgeleitet von TIdRequestHeaderInfo.

RequestInfo wird an die ISAPI.dlls weitergegeben und steht dort als Request vom Type TWebRequest zur Verfügung.

Die Attribute von RequestInfo auf Serverseite und Request auf DLL-Seite sind aber nicht identisch, es gibt lediglich eine Schnittmenge, welche Username und Password nicht enthält.

Momentan sehe ich keine Lösungsmöglichkeit für dieses Problem.
  Mit Zitat antworten Zitat
Thom

Registriert seit: 19. Mai 2006
570 Beiträge
 
Delphi XE3 Professional
 
#7

AW: Anmelden an Webmodul über IdHTTP

  Alt 10. Apr 2013, 13:09
Ich habe die Methode Test mal etwas abgewandelt:
Delphi-Quellcode:
procedure TWebModule1.WebModule1TestAction(Sender: TObject; Request: TWebRequest; Response: TWebResponse; var Handled: Boolean);
var
  N: Integer;
  S: String;
begin
  S := String(Request.Authorization);
  N := Pos(' ',S);
  if N > 0 then
  begin
    Delete(S,1,N);
    S := TIdDecoderMIME.DecodeString(s);
    N := Pos(':',S);
    if N > 0 then
    begin
      Response.Content:=Request.GetFieldByName('ALL_RAW');
      Exit;
    end;
  end;
  Response.WWWAuthenticate := 'Basic';
  Response.StatusCode := 401;
end;
Damit wird jetzt der komplette Header, der vom Browser an den Server übertragen wird, angezeigt:
Code:
Connection: Keep-Alive
Content-Length: 0
Accept: text/html, application/xhtml+xml, */*
Accept-Encoding: gzip, deflate
Accept-Language: de-DE
Authorization: Basic VGVzdDpCbHVi
Cookie: [...]
Host: maps4delphi.com
User-Agent: Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; WOW64; Trident/5.0)
X-Original-URL: /test
Hier kann man schön sehen, daß die Anmeldedaten wirklich im Wert "Authorization" enthalten sind.
Funktioniert das bei Dir in der Delphi 7 Dll?
Thomas Nitzschke
Google Maps mit Delphi
  Mit Zitat antworten Zitat
Antwort Antwort

Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche
Ansicht

Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 15:26 Uhr.
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz