oso_de_la_nariz: Basic Auth per header (Location..) ??

Moin Gemeinde,

ich möchte auf einer Website angemeldete User weiterleiten auf eine andere WebSite die per Basic Authentification gesichert ist.
Dabei ist für jeden User die dortige User/Passwort - Kombi bekannt.
Um es dem User zu vereinfachen (damit er nicht jedesmal sein User/PW angeben muss) möchte ich ihn einfach weiterleiten per

header('Location: http://xxxx

Die zum User gehörige Kombination ist in ner DB gespeichert und soll halt einfach mit übergeben werden.

Geht das überhaupt?
Mir sind keine Parameter bekannt die das ermöglichen. Oder mal anders gefragt: Kann ich die Eingabe der Daten (der Basic Authentification) irgendwie sinnvoll automatisieren?

Wenn nein .. wie sollte ich es dann machen?
Per URI (oder GET) klappt das ja wohl auch nicht :-(

Was würdet Ihr mir raten?

oso

PS:

  1. Hello,

    Dennis hat erst neulich schön erklärt, wie es zusammengebaut ist

    http://forum.de.selfhtml.org/archiv/2007/10/t160748/#m1045634

    Das Problem wird nur sein, wie bringst Du dem Browser bei, die Auth-Daten auch an eine andere URL mitzusenden. Er hat von dort ja noch keine Aufforderung dazu bekommen (Status 401), die Daten zu erfragen und sie dann bei Erfolg in Zukunft immer mitzusenden (bis keine Instanz des Fenstersmeh geöffnet ist)

    Harzliche Grüße vom Berg
    http://bergpost.annerschbarrich.de

    Tom

    --
    Fortschritt entsteht nur durch die Auseinandersetzung der Kreativen
    Nur selber lernen macht schlau
    Ein Jammer ist auch, dass die Dummen so selbstsicher und die Klugen voller Zweifel sind. Das sollte uns häufiger zweifeln lassen :-)

  2. Hi oso_de_la_nariz,

    Um es dem User zu vereinfachen (damit er nicht jedesmal sein User/PW angeben muss) möchte ich ihn einfach weiterleiten [...]

    Wenn du im Internet nach Lösungen zu deinem Problem suchst, wirst du sicherlich auf die Antwort stoßen, den User auf folgende URL zu leiten:

    http://username:password@example.org/

    Das ist allerdings kein HTTP-Standard. Nun gut, wenn es zuverlässig funktionieren würde, könntest du es ja trotzdem benutzen - das Problem ist aber, dass es genau das nicht tut. ;-)

    Früher hatten die meisten Browser dies implementiert, dass man (ohne Nachfrage an den User), auf der Zielseite dann so authentifiziert wurde. Leider wurde damit viel Unfug gebaut, diese Technik also mißbraucht - zum Beispiel:

    http://www.microsoft.com:anything@boese-seite.example.org/

    Ein normaler Internetuser wird hierbei denken, dass er die Seite www.microsoft.com besucht, sich von dieser Seite also Updates für sein (Windows-) Betriebssystem herunterladen etc. In Wirklichkeit besucht er aber die Seite boese-seite.example.org und ist dort lediglich als www.microsoft.com authentifiziert. Aber welcher „normale” Internetuser soll das schon wissen?

    Aus diesem Grund funktioniert das heutzutage in sämtlichen verbreiteten Browsern nicht mehr, oder wenn, dann nur mit einer Sicherheitsfrage, welche der User explizit bestätigen muss.

    Geht das überhaupt?
    Mir sind keine Parameter bekannt die das ermöglichen. Oder mal anders gefragt: Kann ich die Eingabe der Daten (der Basic Authentification) irgendwie sinnvoll automatisieren?

    Da obige Methode flach fällt, bleibt nur noch eine Lösung übrig - und zwar, du lässt deinen Server als Proxy fungieren. Im Prinzip läuft das darauf hinaus, dass du ein Script schreibst, welches die Daten vom fremden Server unter Verwendung der hinterlegten Benutzerdaten abruft und die Rückgabe des fremden Servers an den Besucher durchschleust.

    So viel zur Theorie. Das praktisch umzusetzen ist allerdings ziemlich aufwändig. Es reicht nicht, einfach die Rückgabe des fremden Servers durchzureichen an den User, dein Server müsste auch alle Links (dazu gehören auch Bild-, CSS- und Javascript-Ressourcen) welche auf den fremden Server verweisen umschreiben, sodass diese Links auf deinen Server verweisen und dieser den Content ausliefern kann.

    Beispiel - die fremde URL lautet http://fremder-server.invalid/startseite.html, darin ist folgender HTML-Code enthalten:

    ~~~html <a href="/unterseite.html">
        <img src="/img/page.jpg" alt="" /> Unterseite
      </a>

      
    Dein Server soll unter der URL http://dein-server.invalid/proxy.php?url=startseite.html die Seite zurückliefern, dann müsste dein Server das hier zurückliefern:  
      
      ~~~html
    <a href="/proxy.php?url=unterseite.html">  
        <img src="/proxy.php?url=img/page.jpg" alt="" /> Unterseite  
      </a>
    

    Warum du das machen musst?
    a) Weil die relativen Links der fremden Seite nicht mehr stimmen, wenn du die Seite unter einer URL auf deinem Server auslieferst.
    b) Weil die Ressourcen hinter manchen URIs des fremden Servers auch geschützt sein könnten, und somit der User nach Benutzername und Passwort gefragt würde, wenn sein Browser direkt den fremden Server kontaktieren würde.

    Zusammengefasst: Bei diesem Verfahren findet nur eine Kommunikation von

    Client <-> Dein Server <-> Fremder Server

    statt. Es findet *keine* Kommunikation von

    Client <-> Fremder Server

    statt.

    Was würdet Ihr mir raten?

    Das von mir erläuterte Verfahren, dass dein Server als Proxy fungiert, ist ziemlich aufwändig und dürfte deinen Server recht stark belasten, sodass ich davon abraten würde.

    Back to the roots, jeder (vernünftige) Browser bietet eine Möglichkeit, dass ich Benutzername und Passwort speichern kann. Wenn du mir also einen ganz normalen Link auf eine fremde Seite gibst, à la

    http://fremder-server.invalid/

    dann klicke ich als Besucher da drauf, der Dialog für Benutzername und Passwort geht auf, ich habe die Daten eingespeichert, drücke einfach nur einmal Enter und gut ist.

    Warum also alles komplizierter machen als es ist?

    Viele Grüße,
      ~ Dennis.

    1. Hi Dennis,
      ich danke Dir für Deine ausführlichen Erläuterungen!

      Im Prinzip habe ich das so verstanden:
      Die Abfrage User/PW kommt erst durch den Request des Server zustande, daher kann ich (mittlerweile) die Daten nicht gleich mitsenden.
      Ich könnte ja z.B. mittels CURL mir den Request schon mal holen .. um ihn dann ausgefüllt durch Username/PW wieder abzusetzen. Oder ist das auch völliger Bullshit?

      Warum ich das machen will?
      Die User eines Intranets haben zu vielen Banken/Versicherungen verschiedene User/Passwort-Kombis. Es ist ne ziemliche vereinfachung (für den User) diese einfach hier im Intranet ablegen zu können, und immer einfach nur auf nen "Connect-Knopf" zu drücken OHNE jedesmal die Daten einzugeben. Das hat bisher auch bei allen Sites (30 Banken/Versicherungen - 300 User)funktioniert, nur eben bei der Basic Auth nicht :-(

      Trotzdem Danke noch mal!

      oso

      1. Hello,

        Im Prinzip habe ich das so verstanden:
        Die Abfrage User/PW kommt erst durch den Request des Server zustande, daher kann ich (mittlerweile) die Daten nicht gleich mitsenden.

        Genau, bei Standardbrowsern geht das nicht.
        Die merken sich einfach nicht, dass sie zukünftig an eine bestimmte Seite die Zugangsdaten im Header mitsenden sollen bei JEDEM Request, wenn sie nicht vorher durch den Status 401 dazu aufgefordert worden sind.

        Dem Server ist das egal.
        Wenn der die Daten im Header entdeckt, nachdem er mit dem Request des Clients auf einen "geschützten Bereich" trifft, und die Daten passen zu seiner Vorgabe, dann macht er auf. Sonst verzweigt er auf den Mechanismus 401 senden.

        Du könntest also die Browser modifizieren ;-)

        Eventuell sind solche Spiele auch durch eine "Browsershell", wie die HTA-Technik möglich.
        Auf jeden Fall wären sie durch einen intelligenten Proxy möglich. Der kann dem Header jedes Requests ja hinzufügen, was er will.

        Da könnte der User eine Session mit dem Proxy aufbauen und der würde dann mittels dieser bei jedem Request feststellen, ob Zugangsdaten hinzugefügt werden müssen.

        Harzliche Grüße vom Berg
        http://bergpost.annerschbarrich.de

        Tom

        --
        Fortschritt entsteht nur durch die Auseinandersetzung der Kreativen
        Nur selber lernen macht schlau
        Ein Jammer ist auch, dass die Dummen so selbstsicher und die Klugen voller Zweifel sind. Das sollte uns häufiger zweifeln lassen :-)