mr.burns: PHP NTLM Authentifizierung

Hallo,

ich habe einen MicroSoft SQL Reporting Server.
Wenn ich einen Report aufrufe, so werde ich nach Username und Passwort gefragt (NTLM).
Nun möchte ich diesen Report über einen Link von einem Apache Server mit PHP aufrufen.
Auf dem Apache Server habe ich bereits NTLM lauffähig.
Habe mir eine PHP-Seite erstellt, die auch eine NTLM-Abfrage von Username und Passwort macht.
Nun möchte ich, wenn man sich einmal auf dem Apache mit NTLM authentifiziert hat, dass der Username und Passwort automatisch an den MicroSoft SQL Reporting Server übertragen wird und der Report startet, damit sich der User nicht mehrmals anmelden muß.

Meine Hauptintranetseite ist also Apache/PHP, auf der sich der User einloggt.
Daraus sollen Reports des MicroSoft SQL Reporting Server aufgerufen werden können, ohne erneut Usernamen und Passwort eingeben zu müssen.

Meine Frage nun, wie kann man, aus PHP heraus NTLM Usernamen und Passwort zum Micsrosoft Server übertragen so dass er es als NTLM Autentifizierung akzeptiert?

Danke für jede Art von Hilfe!

  1. Hallo!

    Habe mir eine PHP-Seite erstellt, die auch eine NTLM-Abfrage von Username und Passwort macht.

    Ok.

    Meine Frage nun, wie kann man, aus PHP heraus NTLM Usernamen und Passwort zum Micsrosoft Server übertragen so dass er es als NTLM Autentifizierung akzeptiert?

    Wie du es oben beschrieben hast, nur ohne vorherige Abfrage des Users - wo genau ist das Problem dabei  - hast Du ein Codebeispiel?

    Ciao

    GG

    --
    "If I do not seek to understand what is happening here
    - then I've got peanuts in my head!"
    (I. Hosein)
    1. Hello,

      wo genau ist das Problem dabei?

      Die NTLM-Authentifizierung ist eine verbindungsorientierte, die Requests per HTTP sind verbindungslos.

      Vielleicht hilft diese Seite weiter
      http://www.phpcs.com/code.aspx?ID=25272

      Liebe Grüße aus dem schönen Oberharz

      Tom vom Berg

      --
      Nur selber lernen macht schlau
      http://bergpost.annerschbarrich.de
      1. Hallo Tom,

        dnake für diene Antwort, aber das Sctipt in Deinem Link kenne ich schon, es stoppt bei mir mit: 'NTLM Flag error!'.
        Ich kann kein französisch um damit zurechtzukommen.

        Das Problem ist, wie mache ich dem Windows Reporting-Rechner klar, welcher User den Report aufruft?

        1. Die PHP-Seite läuft auf dem Apache Linux Server, hat eine eigene IP.
        2. Auf der PHP-Seite loggt man sich ein, erhalte dadruch einen Usxername und Passwort
        3. Nach einloggen auf dem Apache-Server, bekommt der User eine HTML/PHP-Seite angezeigt, mit Links zu verschiednenen Reports.
        4. Diese Reports liegen auf dem Windows SQL Reporting Server (andere IP)

        Wie mache ich es nun, wenn der User auf einen Report-Link klickt, dass der Reporting Server NICHT nach Usernamen un Passwort fragt?
        Ich muß also irgendwie in der URL oder per POST / GET den Usernamen und Passwort an den Windows Reporting-Server übertragen. Der muß das dann so erkennen als hätte ich es in dem Login-Fenster eingegen.

        Aber wie!?!

        Danke für weitere Hilfe!

        Hello,

        wo genau ist das Problem dabei?

        Die NTLM-Authentifizierung ist eine verbindungsorientierte, die Requests per HTTP sind verbindungslos.

        Vielleicht hilft diese Seite weiter
        http://www.phpcs.com/code.aspx?ID=25272

        Liebe Grüße aus dem schönen Oberharz

        Tom vom Berg

        1. Hello,

          danke für diene Antwort, aber das Sctipt in Deinem Link kenne ich schon, es stoppt bei mir mit: 'NTLM Flag error!'.
          Ich kann kein französisch um damit zurechtzukommen.

          Ich kann's zumindest lesen :-)
          Allerdings steige ich da auch noch nicbt hanz durch.

          if (ord($chained64[13]) != 178)
                      {
                          echo "NTLM Flag error!";
                          exit;
                      }

          Aber schau Dir mal den Byte-Wert an, der da erwartet wird. Der ist größer als 127 und das knipst bei mir immer gleich die rote Lampe an in Verbindung mit HTTP/HTML und Codierung...

          Ist jetzt nur eine unbestimmte Bauch-Idee, aber in welcher Codierung läuft Deine Webseite?

          Liebe Grüße aus dem schönen Oberharz

          Tom vom Berg

          --
          Nur selber lernen macht schlau
          http://bergpost.annerschbarrich.de
          1. Hallo Tom,

            das Skript ist denke ich nicht der richtige Weg, da nur ein NTLM-Login angeboten wird, und dann (bei Authentifizierung) zu einer anderen PHP Seite DESSELBEN Servers weitergeleitet wird, ich muß aber die Anmeldeinformationen von Linux entgegennehmen und dann an Windows weiterleiten!

            Nochmal:

            Die Eingabe des Usernamens und des Passworts findet auf der Linux-Seite statt, auf einem eigenen Server, mit eigener IP.
            Diesen Usernamen und das Passwort möchte ich an den Windows-SQL Reporting Server leiten, so dass er das 'normale' Login-Window nichtmehr anzeigen muß.

            Ich muß also irgendwie (POST, GET) den Benutzernamen und das Passwort an den Windows-Server übertragen.
            Ich weiß aber nicht, wie ich das mache!

            Danke für weitere Hilfe

            Hello,

            danke für diene Antwort, aber das Sctipt in Deinem Link kenne ich schon, es stoppt bei mir mit: 'NTLM Flag error!'.
            Ich kann kein französisch um damit zurechtzukommen.

            Ich kann's zumindest lesen :-)
            Allerdings steige ich da auch noch nicbt hanz durch.

            if (ord($chained64[13]) != 178)
                        {
                            echo "NTLM Flag error!";
                            exit;
                        }

            Aber schau Dir mal den Byte-Wert an, der da erwartet wird. Der ist größer als 127 und das knipst bei mir immer gleich die rote Lampe an in Verbindung mit HTTP/HTML und Codierung...

            Ist jetzt nur eine unbestimmte Bauch-Idee, aber in welcher Codierung läuft Deine Webseite?

            Liebe Grüße aus dem schönen Oberharz

            Tom vom Berg

      2. Hi!

        Die NTLM-Authentifizierung ist eine verbindungsorientierte, die Requests per HTTP sind verbindungslos.

        Ein HTTP-Request in sich ist verbindungsorientiert. Jeder Request läuft dabei in seiner NTLM-authentifizierten Verbindung. Für jeden Request wird die NTLM-Authentication übrigens neu ausgehandelt.

        Lo!

    2. Hallo Guy Gaz,

      danke für deine Antwort.
      Ich glaube es ist nicht ganz klar geworden, was ich möchte.
      Der Server, auf dem der User sein Usernamen und Passwort eingibt ist ein Apache der auf einem Linux (Debian) läuft.
      Auf dem Apache habe ich eine Webseite, auf die sich der User einmal einloggen soll.
      Ich habe eine HTML-Seite erstellt, die Links zu dem (Windows) Reporting-Server enthält.
      Wenn ein User nun einen solchen Link anklickt, fragt der (Windows) Reportserver nach Usernamen und Passwort.

      Das möchte ich verhindern. Da der User sich schon einmal auf dem Apache (Linux) eingeloggt hat, möchte ich nun Usernamen und Passwort an den Windows-Reporting Server senden, um den Report direkt zu starten ohne das das Login-Fenster des Reporting Servers erscheint.
      Hoffe es ist jetzt klarer.

      Danke für Hilfe!

      Hallo!

      Habe mir eine PHP-Seite erstellt, die auch eine NTLM-Abfrage von Username und Passwort macht.

      Ok.

      Meine Frage nun, wie kann man, aus PHP heraus NTLM Usernamen und Passwort zum Micsrosoft Server übertragen so dass er es als NTLM Autentifizierung akzeptiert?

      Wie du es oben beschrieben hast, nur ohne vorherige Abfrage des Users - wo genau ist das Problem dabei  - hast Du ein Codebeispiel?

      Ciao

      GG

      1. Hi!

        Wenn ein User nun einen solchen Link anklickt, fragt der (Windows) Reportserver nach Usernamen und Passwort.
        Das möchte ich verhindern. Da der User sich schon einmal auf dem Apache (Linux) eingeloggt hat, möchte ich nun Usernamen und Passwort an den Windows-Reporting Server senden, um den Report direkt zu starten ohne das das Login-Fenster des Reporting Servers erscheint.

        Das Klicken auf einen Link zum Server B erzeugt einen neuen Request von seitens des Client. Das heißt also, der Client muss befähigt werden, den neuen Request inklusive aller notwendigen Daten auszuführen. Das was vorher auf Server A passiert war, ist dabei irrelevant. Wenn du dortige Daten benötigst, dann musst du den Request vom Client aus an A stellen und der kontaktiert dann B.

        P.s. Bitte zitiere sinnvoll und nicht immer alles.

        Lo!

  2. Hallo,

    kann mir denn hier keiner helfen?

    Brauche immernoch Hilfe!

    Danke!

    1. Hi!

      kann mir denn hier keiner helfen?
      Brauche immernoch Hilfe!

      Dann beschreibe bitte den aktuellen Stand. Nach deiner präzisierten Aufgabenstellung antwortete ich dir, worauf du jedoch nicht eingingst.

      Wenn du den Client über einen Link einen Request ausführen lässt, dann muss der Client in der Lage sein, alle für den Request benötigte Daten selbständig mitzusenden. Wenn es bedeutet, dass er eine andere Ressource als bisher aufruft und dafür noch keine Anmeldedaten vom Benutzer abgefragt hat, sowie diese auch nicht bereits über Linkdaten in den Request einbringen kann (was sicherheitstechnisch mindestens bedenklich wäre), dann gibt es da keine Lösung. Anders wäre es, wenn der Server, der die Credentials bereits kennt, den Request ausführen kann, wobei er dann diese Credentials weitersenden kann. Vorausgesetzt, dass dies geht - zumal die Anmeldedaten durch das NTML-Verfahren nicht im Klartext zum Server gelangen. Ich kenne mich da nicht genug aus, inwieweit man die Anmeldung im Allgemeinen weiterdeligieren kann und wie das dann mit PHP/Apache im Speziellen geht.

      Lo!