Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Netzwerke (https://www.delphipraxis.net/14-netzwerke/)
-   -   Delphi Mit IdHTTPServer eigene Login-Seite realisieren? (https://www.delphipraxis.net/137979-mit-idhttpserver-eigene-login-seite-realisieren.html)

FriFra 1. Aug 2009 11:56


Mit IdHTTPServer eigene Login-Seite realisieren?
 
Wie kann man es hinbekommen, dass man die Authentifizierung am IdHTTPServer statt mit dem Standard-Dialog über eine Webseite macht?

zacki05 1. Aug 2009 14:51

Re: Mit IdHTTPServer eigene Login-Seite realisieren?
 
Delphi-Quellcode:
procedure TForm1.IdHTTPServer1CommandGet(AThread: TIdPeerThread;
  ARequestInfo: TIdHTTPRequestInfo; AResponseInfo: TIdHTTPResponseInfo);
var
  sr:TSearchRec;

begin
if (Pos('/login', LowerCase(aRequestInfo.Document)) = 1) then
begin
   aresponseinfo.ContentType:='text/html';
   if arequestinfo.Params.Values['ParamName']='' then
   begin
   aresponseinfo.ContentText:='<head><meta http-equiv="pragma" content="no-cache">'
   +'</head><html><body>
<form method="POST">

 Name: <input type="text" Name="ParamName"</p>
'
   +'

<input type="Submit" value="&Login"></p> </form></body></html>';
   end
   else
   if arequestinfo.Params.Values['ParamName']='Passwort' then
begin
   aresponseinfo.ContentType:='text/html';
   AResponseinfo.ContentText:=
   '<html><head><META http-equiv="Content-Type" content="text/html; charset=UTF-8">'
   +'<title> Dateiliste </title></head><body><H1> Dateiliste </H1>'
   +'<hr color= "blue" />
<pre>' ; //<pre>[url="/"][To Parent Directory][/url]
   if FindFirst(extractfilepath(paramstr(0))+'\*.*',$7f, sr) = 0 then
    begin
      repeat
        if sr.Size> 0 then
         AResponseinfo.ContentText:=AResponseinfo.ContentText+format('%-20.20s%7s', [datetimetostr(FileDateToDateTime(sr.Time)),inttostr(sr.Size)])
 +'[url="/download/'+sr.name+'"]'+sr.name+'[/url]
' ;
      until FindNext(sr) <> 0;
      FindClose(sr);
     AResponseinfo.ContentText:=AResponseinfo.ContentText+'</pre><hr color= "blue" /></body></html>';
    end;
exit;
end
   else
   aResponseInfo.ResponseNo := 403;

   exit;

end;
So funktioniert das bei mir
"http://irgentwas/login" führt auf die Seite mit einem Editorfeld.
dort gibt man das Passwort ein.
bei erfolg sieht mas das Inhaltsverzeichniss.

zacki05

[edit=SirThornberry]Delphi-Tags gesetzt - nächstes mal bitte selbst machen - Mfg, SirThornberry[/edit]

FriFra 1. Aug 2009 20:19

Re: Mit IdHTTPServer eigene Login-Seite realisieren?
 
Das ist natürlich keine echte Authentifizierung... Ich dachte da eher daran anhand von per form (get oder post) übertragenem Usernamen und Passwort die Authentication selbst zu erzeugen:
Delphi-Quellcode:
...

ARequestInfo.Authentication.Create; //Authentication erzeugen (=> Schutzverletzung)
ARequestInfo.Authentication.Username := sUN; //Feldwerte zuweisen (=> ohne create, auch Schutzverletzung)
ARequestInfo.Authentication.Password := sPW;

...

// Wenn User authentifiziert ist...
if ARequestInfo.AuthExists then
begin

...
Ich bekomme dabei allerdings immer eine Schutzverletzung :gruebel: :roll:

SirThornberry 1. Aug 2009 22:19

Re: Mit IdHTTPServer eigene Login-Seite realisieren?
 
@Frifra: RequestInfo ist eben vom Request und nicht für die Response. Entsprechend solltest du aus RequestInfo auch nur lesen! Zudem befindet sich unter ARequestInfo.Authentication.Username eben der Benutzername welcher über den Standarddialog eingegeben wurde (also der welcher bei einem Apache-Server per .htaccess mit Basic Authentication eingeleitet wird).

Zitat:

Ich dachte da eher daran anhand von per form (get oder post) übertragenem Usernamen und Passwort die Authentication selbst zu erzeugen:
Wie jetzt? Per get/post werden doch Daten vom Client zum Server übertragen. Entsprechend kannst du nicht auf dem Server was eingeben und dem Client rüber reischen.
Wie sollte das ganze denn ablaufen (aus Sicht Anwender vor Browser)?
Es ist doch so das der Anwender(Client) eine Seite aufruft und diese vom Server zurückgegeben wird. Dort trägt der Nutzer(Client) dann seine Daten clientseitig in eine Art Formular ein und schickt diese wieder an den Server. Der Server kann dann auswerten was der Client per post/get übermittelt hat und kann entsprechend das eine oder andere als Antwort schicken.

[Edit]Das was hier ( http://www.delphipraxis.net/internal...=848581#848581 ) gefragt wurde und laut diesem Thread auch FriFras anliegen ist wurde von zacki05 bereits gepostet. Der Server liefert Daten für eine html-seite mit Formular zurück und wenn Daten an den Server mit entsprechenden Formulardaten geschickt werden reagiert dieser auch darauf und schickt eine entsprechend andere Seite.
Zur besseren Übersicht würde man den eigentlichen Webseiten-Quelltext in den meisten Fällen zwar in einer externen Datei oder Ressource lagern und von da laden, aber das Prinzip ist exakt das gleiche.

FriFra 1. Aug 2009 22:40

Re: Mit IdHTTPServer eigene Login-Seite realisieren?
 
Zitat:

Zitat von SirThornberry
@Frifra: RequestInfo ist eben vom Request und nicht für die Response. Entsprechend solltest du aus RequestInfo auch nur lesen! Zudem befindet sich unter ARequestInfo.Authentication.Username eben der Benutzername welcher über den Standarddialog eingegeben wurde (also der welcher bei einem Apache-Server per .htaccess mit Basic Authentication eingeleitet wird).

Ich würde halt gern versuchen anhand der über das Formular vom Client versandten Daten quasi eine Basic Authentifizierung zu simulieren, indem ich die Parameter, die normalerweise über den dialog eingegeben werden mit den bereits an den Server übermittelten Formulardaten zu initialisieren. Ziel der Übung ist, dass ARequestInfo.AuthExists True ist (das bleibt es ja bei Basic authentication auch wärend der gesamten Browser-Session).

Zitat:

Zitat von SirThornberry
Es ist doch so das der Anwender(Client) eine Seite aufruft und diese vom Server zurückgegeben wird. Dort trägt der Nutzer(Client) dann seine Daten clientseitig in eine Art Formular ein und schickt diese wieder an den Server. Der Server kann dann auswerten was der Client per post/get übermittelt hat und kann entsprechend das eine oder andere als Antwort schicken.

Und wie stellst du dir das vor? Soll ich vor jede Seite erst eine Loginseit schalten? Ich benötige eine persistente Session, die nicht für jede URL neu simuliert werden muss. Ich habe halt nicht nur eine seite, die man dann nur mit einem Formular schützen könnte. Nach Deinem Vorschlag wären ja beim aufruf der 2. Seite wieder keine authentifizierungsdaten mehr da, so dass das spiel von vorne los gehen würde...

SirThornberry 1. Aug 2009 22:57

Re: Mit IdHTTPServer eigene Login-Seite realisieren?
 
Zitat:

Ich habe halt nicht nur eine seite, die man dann nur mit einem Formular schützen könnte. Nach Deinem Vorschlag wären ja beim aufruf der 2. Seite wieder keine authentifizierungsdaten mehr da, so dass das spiel von vorne los gehen würde...
Schau dir mal die ganzen Foren an. Da wird nach erfolgreichem einloggen eine SessionID generiert welche bei jedem folgenden Seitenaufruf mit gesendet wird (oder sie wird eben in einem Cookie plaziert und bleibt somit erhalten und wird ebenfalls immer mitgesendet)

FriFra 1. Aug 2009 23:05

Re: Mit IdHTTPServer eigene Login-Seite realisieren?
 
Zitat:

Zitat von SirThornberry
Zitat:

Ich habe halt nicht nur eine seite, die man dann nur mit einem Formular schützen könnte. Nach Deinem Vorschlag wären ja beim aufruf der 2. Seite wieder keine authentifizierungsdaten mehr da, so dass das spiel von vorne los gehen würde...
Schau dir mal die ganzen Foren an. Da wird nach erfolgreichem einloggen eine SessionID generiert welche bei jedem folgenden Seitenaufruf mit gesendet wird (oder sie wird eben in einem Cookie plaziert und bleibt somit erhalten und wird ebenfalls immer mitgesendet)

Sorry, ich hab dazu bisher überhaupt noch nichts gefunden. Wie muss ich mir das "mitsenden" der Session-ID vorstellen? Über Parameter? Ich kann in meinem HTTP Code keine Cookies verarbeiten... da ich größtenteils nur "Content-Type: text/text" übertrage (Ajax Anwendung) und die URLs OHNE zusätzliche Parameter auskommen müssen. mit der basic-authentication klapps... nur heutzutage sollte man das schon über ein formular machen..

SirThornberry 1. Aug 2009 23:12

Re: Mit IdHTTPServer eigene Login-Seite realisieren?
 
richtig, die Session-ID wird in allen mir bekannten Fällen (wenn Cockies deaktiviert sind) per Get übergragen (also im Browser an die URL angehangen). Wenn du in deinem Browser die Cockies mal deaktivierst und hier in der DP unterwegs bist solltest du dann entsprechend in der Adressleiste das ganze erspähen können.

FriFra 1. Aug 2009 23:16

Re: Mit IdHTTPServer eigene Login-Seite realisieren?
 
Dann ist es leider für mich nicht brauchbar... bei Basic-authentication benötige ich weder Cookies, noch irgendwelche Parameter.... Also müsste ich doch irgendwie eine Basic-Authentication quasi in den Request "injizieren" um alle folgenden Seiten mit dieser Anmeldung zu bekommen.

mjustin 2. Aug 2009 09:40

Re: Mit IdHTTPServer eigene Login-Seite realisieren?
 
Zitat:

Zitat von FriFra
Dann ist es leider für mich nicht brauchbar... bei Basic-authentication benötige ich weder Cookies, noch irgendwelche Parameter.... Also müsste ich doch irgendwie eine Basic-Authentication quasi in den Request "injizieren" um alle folgenden Seiten mit dieser Anmeldung zu bekommen.

Ob's hilft weiss ich nicht, aber mit einem HTTP Proxy (Don's Proxy auf Sourcforge, oder einem Plugin wie Live HTTP Headers) kann man sich die gesamte Authentifizierungsabfolge schön ansehen.

Bei Basic Authentifizierung sind allerdings auch Parameter im Spiel, nicht in der URL, aber im HTTP Header. - Muss ja, wo sonst ;)

Und einen Authentifizierungs-Request-Header des Clients durch den Server setzen lassen zu können, ist im HTTP Protokoll, soviel ich weiss, nicht vorgesehen.


Alle Zeitangaben in WEZ +1. Es ist jetzt 08:03 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