Passwort vergessen?

Benutzername vergessen?

Alles rund um IT, Web und Entwicklung.
Von Nutzern für Nutzer.

PHP LDAP Authentifizierung und Anbindung



Im Unternehmensumfeld ist LDAP (=Lightweight Directory Access Protocol) die zentrale Anlaufstelle für die Benutzerauthentifizierung. Auch Webapplikationen mit PHP lassen sich sehr einfach ohne weitere Hilfsklassen an LDAP anbinden.



LDAP Server


In der Regel wird der LDAP Service vom Domain Controller (z.B. Active Directory) zur Verfügung gestellt. Aber auch die Linux Implementierung OpenLDAP kommt teilweise zum Einsatz.


Implementierung


Zunächst setzen wir die grundlegenden Variablen. Der Einfachheit nach setzen wir die Login Daten des zu authentifizierenden Benutzers manuell. Diese können natürlich auch per $_POST oder $_GET von einem Formular entgegengenommen werden.

<?php 

// Daten des zu authentifizierenden Benutzers (z.B. aus Formular)
$domain "foxplex";
$username "testbenutzer";
$password "passwort";

// LDAP Daten
$ldap_address "ldap://ldap.foxplex.com";
$ldap_port 389;

?>



Im nächsten Schritt wird die Verbindung zum LDAP Server aufgebaut.

<?php 

if ($connect ldap_connect($ldap_address$ldap_port)) {
   
// Verbindung erfolgreich
   
ldap_set_option($connectLDAP_OPT_PROTOCOL_VERSION3);
   
ldap_set_option($connectLDAP_OPT_REFERRALS0);

} else {
   
// Verbindung fehlgeschlagen
}
?>



Jetzt können wir innerhalb des Blocks "Verbindung erfolgreich" einen Login Versuch mit dem Benutzer starten. Um den Erfolg oder Misserfolg abzufangen packen wir die Abfrage wieder in einen IF-Block.

<?php 

   
// Authentifizierung des Benutzers
   
if ($bind ldap_bind($connect$domain "\\" $username$password)) {
      
// Login erfolgreich

   
} else {
      
// Login fehlgeschlagen / Benutzer nicht vorhanden
   
}

?>


Ist der Login erfolgreich fragen wir die notwendigen Daten wie Vorname, Nachname und den Status des Accounts ab. Dies wird in PHP über eine LDAP Suche durchgeführt.

Die Variable $dn ist entsprechend der eigenen Domäne anzupassen.



Über den LDAP Status prüfen wir, ob der Account evtl. gesperrt ist. Wenn ja wird der Benutzer nicht eingeloggt.


Gesamtes Skript


Hier nochmal zusammenfassend das gesamte PHP Skript.

<?php 

@session_start();

// Daten des zu authentifizierenden Benutzers (z.B. aus Formular)
$domain "foxplex";
$username "testbenutzer";
$password "passwort";

// LDAP Daten
$ldap_address "ldap://ldap.foxplex.com";
$ldap_port 389;


if (
$connect ldap_connect($ldap_address$ldap_port)) {
   
// Verbindung erfolgreich
   
ldap_set_option($connectLDAP_OPT_PROTOCOL_VERSION3);
   
ldap_set_option($connectLDAP_OPT_REFERRALS0);

   
// Authentifizierung des Benutzers
   
if ($bind ldap_bind($connect$domain "\\" $username$password)) {
      
// Login erfolgreich
      // Benutzerdaten abfragen
      
$dn "DC=foxplex,DC=com";
      
$person "$username";
      
$fields "(|(samaccountname=*$person*))";

      
$search ldap_search($connect$dn$fields);
      
$result ldap_get_entries($connect$search);

      
$ldap_username $res[0]['samaccountname'][0];
      
$ldap_first_name $res[0]['givenname'][0];
      
$ldap_last_name $res[0]['sn'][0];
      
$ldap_status $res[0]['useraccountcontrol'][0];

      
ldap_close($connect);
      
      
// Prüfen ob Konto gesperrt ist

      
if ($ldap_status == 512) {

         
// Nicht gesperrt
         
$_SESSION['username'] = $ldap_username;
         
$_SESSION['loggedin'] = true;                       
         return 
true;

      } else {
          
// Gesperrt
          
$_SESSION['loggedin'] = false;
          return 
false;

      }

   } else {
      
// Login fehlgeschlagen / Benutzer nicht vorhanden
   
}

} else {
   
// Verbindung fehlgeschlagen
}?>



Verschlüsselung


Die Übertragung der Daten und damit auch der Passwörter wird bei der oben genannten Lösung unverschlüsselt und im Klartext übertragen. Gerade im Unternehmen sollte man hier die Verbindung mit LDAPS verschlüsseln.

In der Regel genügt es die PHP Variablen für die LDAP Verbindung anzupassen.

<?php 

// LDAP Daten mit Verschlüsselung
$ldap_address "ldaps://ldap.foxplex.com";
$ldap_port 636;

?>


Funktioniert der Login dann immer noch nicht kann es sein, dass der Server auf dem die PHP Webapplikation läuft dem Zertifikat nicht vertraut.

Dies lässt sich auf einem Linux Server über einen Eintrag in der OpenLDAP Konfiguration /etc/openldap/ldap.conf ändern.

TLS_REQCERT never

Auf einem Windows Server wird die nachfolgende Umgebungsvariable gesetzt:

LDAPTLS_REQCERT=never

Sollten alle Stricke reißen, kann die Option auch noch direkt vor dem ldap_connect in PHP gesetzt werden:

<?php putenv('LDAPTLS_REQCERT=never');?>


Fazit


Mit LDAP steht eine sehr gute zentrale Lösung zur Nutzerverwaltung zu Verfügung. Auch in PHP kann man diese Schnittstelle ohne große Umwege und zusätzlichen Ballast in Form von Klassen nutzen.


Michael Kostka

Fachinformatiker / Systemintegration
Ich schreibe hier regelmäßig zu den Themen Android, Web, Linux und Hardware.

Raspberry Pi Starter Kit
DataCloud

Hinterlasse einen Kommentar

Ich habe die Datenschutzerklärung zur Kenntnis genommen und stimme einer elektronischen Speicherung und Verarbeitung meiner eingegebenen Daten zur Beantwortung der Anfrage zu.