festus94
Goto Top

LDAP-Login an AD vom Internet aus mittels PHP-Script

Ich möchte eine LDAP-gestützte Login-Möglichkeit schaffen, die es Usern erlaubt, sich über eine Website über das Netzwerk für Inhalte zu authentifizieren. Diese Inhalte stammen nicht aus dem AD, sondern vom Webserver selbst.

Hallo zusammen,

wie oben beschrieben, bin ich gerade dabei, ein PHP-Script zu erstellen, welches mit eine Authentifizierung per LDAP in meinem AD ermöglicht. Dazu habe ich viele Seiten im Internet durchsucht, und hier im Forum schon einen Beitrag gefunden, welcher ein Script enthielt, welches für den Anfang genau das Richtige war.

Anleitung: PHP Loginscript für (LDAP) Activedirectory Benutzer

Ich habe das Script angepasst, sodass es für meine Bedürfnisse optimiert ist.
Dabei ist Folgendes herausgekommen:

<?php
  function ldap_login($server){
      if((isset($_COOKIE["cookie_username"]) AND ($_COOKIE["cookie_password"]))){  
        $username = $_COOKIE["cookie_username"] ;  
        $password = $_COOKIE["cookie_password"] ;  

        $check_positive = 1 ;
      }
      else{
       if((isset($_POST["username"]) OR ($_POST["password"]))){  
         if(empty($_POST["username"]) OR empty($_POST["password"])){  
           $array["login_complete"] = "Bitte füllen Sie alle Felder aus !" ;  
         }
         else{
           if((isset($_POST["username"]) AND ($_POST["password"]))){  
             $username = $_POST["username"] ;  
             $password = $_POST["password"] ;  

             $check_positive = 1 ;
          }
        }
      }
      else{
        $array["login_complete"] = "Sie sind nicht eingeloggt !" ;  
      }
    }

    if($check_positive == 1){
      if(!($connection = ldap_connect($server))){
        $array["login_complete"] = "Verbindung zum Server konnte nicht hergestellt werden !" ;  
      }

      ldap_set_option($connection, LDAP_OPT_PROTOCOL_VERSION, 3) ;
      ldap_set_option($connection, LDAP_OPT_REFERRALS, 0) ;

      if(!($bind = ldap_bind($connection, $username, $password))){
        $array["login_complete"] = "Login fehlgeschlagen !" ;  
      }
      else{
        setcookie("cookie_username", $username, time()+(60*60)) ;  
        setcookie("cookie_password", $password, time()+(60*60)) ;  

        $array["login_check"] = true ;  
      }
    }

    $array["username"] = $username ;  
    $array["password"] = $password ;  
    $array["connection"] = $connection ;  

    return $array ;
  }
?>

Rufe ich die Funktion nun auf, indem ich ein Formular nutze, so erhalte ich folgende Fehlermeldung:

Warning: ldap_bind() [function.ldap-bind]: Unable to bind to server: Invalid credentials in <entfernt> on line 36

Wie zu erwarte, befindet sich in Zeile 36 der Funktionsaufruf von ldap_bind().

An dem Benutzer im AD kann es nicht liegen. Ich habe es sogar mit einem Domänen-Admin ausprobiert. Im Router habe ich auch alle Ports geöffnet, und auf den DC geleitet.

Nun meine Fragen:

  1. Reicht ein "normales" AD auf dem DC aus, oder muss ich auch die Rolle "AD LDS" installieren? Geht das nachträglich überhaupt noch, ohne sich die Domäne zu zerschießen?
  2. Ist das Script fehlerhaft, und deshalb kommt keine Bindung zustande?
  3. Welche Rechte benötigt der Benutzer, der sich spätereinloggen will, bzw. welchen Gruppen im AD muss er angehören?


Ich danke Euch für Eure Antworten und wünsche einen schönen Abend.

tbnwadm

Content-Key: 178196

Url: https://administrator.de/contentid/178196

Printed on: April 16, 2024 at 09:04 o'clock

Member: dog
dog Dec 29, 2011 at 19:13:59 (UTC)
Goto Top
Dabei ist Folgendes herausgekommen:

Also von der Code-Qualität bekomme ich Kopfschmerzen, aber gut...

Invalid credentials

Lass mich mal raten...
Du hast als Benutzername sowas wie "benutzer" als Username eingegeben?
Das funktioniert genau...niemals.

Weil Microsoft aber so nett ist haben sie eine alternative erlaubt:
"domain\benutzer" oder "benutzer@domain.name"
geht.

Aber auch das ist falsch!

Die korrekte Methode sich bei LDAP zu authentifzieren ist einzig mit dem DN des Objekts.
Und den erhält man (und so macht es auch Windows selbst) indem man sich zuerst mit dem eigenen Dienstkonto an LDAP anmeldet und dann über "(sAMAccountName=...)" nach dem Benutzerobjekt sucht.
Wenn das Ergebnis eindeutig ist benutzt man den erhaltenen DN und das Passwort des Benutzers für die Bindung.
Member: Festus94
Festus94 Dec 29, 2011 at 19:18:52 (UTC)
Goto Top
Hi dog,

ich bin für Verbesserungsvorschläge immer offen. ;)

Ich habe sowohl den einfachen Namen, als auch das Format vom DN benutzt. (cn=benutzer, cn=users, dc=..., dc=local)

Beides hat nicht geklappt.

Kannst Du das irgendwie erklären ?

Wie soll ich denn nach dem Benutzerobjekt suchen, ohne eingeloggt zu sein ?
So wieich das verstanden habe, muss ich mich normal mit dem User einloggen und dann kann ich die Dienste des ADs nutzen.

Welches Dienstkonto meinst Du denn ?


Gruß
tbnwadm
Member: dog
dog Dec 29, 2011 at 19:31:13 (UTC)
Goto Top
Kannst Du das irgendwie erklären ?

Ich kann dir nur sagen, das es bei mir problemlos funktioniert.
Über Internet und mit Server 2008 und 2008 R2.

Welches Dienstkonto meinst Du denn ?

Im Fall von Windows das Computerkonto.
Es reicht aber schon irgendein Konto das mind. das AD durchsuchen kann.
Member: Festus94
Festus94 Dec 29, 2011 at 19:45:50 (UTC)
Goto Top
Okay, so hab' ich's ja auch. W2K8 R2...

Die PCs, die darauf zugreifen sollen, sind aber nicht Teil der Domäne. Es sind normale Heim-PCs.

Wenn es nur solch ein Konto sein muss, dann wäre doch auch direkt das Benutzerkonto des Users okay, oder ?
Member: dog
dog Dec 29, 2011 at 19:53:16 (UTC)
Goto Top
Wenn es nur solch ein Konto sein muss, dann wäre doch auch direkt das Benutzerkonto des Users okay, oder ?

Ja, wenn du dessen DN kennst.
Umlaute können in Benutzernamen/Passwort für Probleme sorgen.
Member: Festus94
Festus94 Dec 29, 2011 at 20:21:17 (UTC)
Goto Top
Okay, der DN für einen User "LDAP", der direkt in der Kategorie "Users" liegt, hat doch dann den DN

CN=LDAP, CN=Users, DC=Domänen-Name, DC=Domänen-Suffix

oder ?

Umlaute habe ich nicht drinnen, aber danke für den Hinweis.
Member: Dirmhirn
Dirmhirn Dec 29, 2011 at 21:33:39 (UTC)
Goto Top
Hi!

schau dir mal adLDAP an:
http://adldap.sourceforge.net/
ist ganz praktisch.

hast schon mal die "ldap_set_option" weggelassen?

sg Dirm
Member: Festus94
Festus94 Dec 29, 2011 at 21:45:28 (UTC)
Goto Top
Hi,

danke, das hört sich interessant an.

Allerdings steht auf der Seite, dass die Klasse für Linux entwickelt wurde. Ich habe allerdings 2K8 R2er-Server im Einsatz.
Funktioniert das trotzdem ?


Danke !
Member: Dirmhirn
Dirmhirn Dec 29, 2011 at 22:09:43 (UTC)
Goto Top
Hi!

dein php läuft auf Windows?
Ich verwends auf einem Ubuntu Server und frag ein Win 2k3 R2 AD ab. Hatte vorher auch direkt die PHP-Funktionen genutzt. Habs vor kurzem gefunden und manches macht die Klasse schon einfacher.- darum hab ichs hier erwähnt.
Im Zweifel ausprobieren.

sg Dirm
Member: Festus94
Festus94 Dec 29, 2011 at 22:49:00 (UTC)
Goto Top
Nee, ich habe die Seiten bei 'nem normalen Provider.

Mein AD läuft auf 'nem 2K8er...
Member: Festus94
Festus94 Jan 01, 2012 at 18:44:54 (UTC)
Goto Top
Ich habe adLDAP ausprobiert, und es ist genial. Danke für den Tipp !!!


Viele Grüße und FROHES NEUES !
tbnwadm