Active Directory-Authentifizierung per LDAP mit PHP

Datum

LDAP ist für viele ein rotes Tuch. Dabei ist die reine Authentifizierung via LDAP an einem Active Directory ziemlich simpel.

Man braucht nur vier Funktionen dafür:

Und man braucht für PHP 7.0 die folgenden Module:

  • php7.0-ldap
  • php7.0-xml

Ein konkretes Beispiel:

<?php
// Wir bestimmen den LDAP-Server und die Domain:
$ldap_dom="meinedomain.local";
$ldap_host="ldap://domaincontroller.$ldap_dom/";
// Die Anmeldeinformationen müssen idR. - falls nicht bereits geschehen - zu UTF-8 konvertiert werden:
$ldap_user=mb_convert_encoding($_POST['username'],"UTF-8");
$ldap_pass=mb_convert_encoding($_POST['password'],"UTF-8");
// Jetzt stellen wir die Verbindung zum Host her:
$ldcon=ldap_connect($ldap_host) or die("Verbindung zum LDAP-Server konnte nicht hergestellt werden.");
// Und jetzt authentifizieren wir den Benutzer.
// Es müssen allerdings leere Felder abgefangen werden, weil sie dazu führen können, dass eine Anmeldung
// vermeintlich klappt. LDAP ist hier etwas eigen.
if($ldap_user!="" && $ldap_pass!="" && ldap_bind($ldcon,"$ldap_user@$ldap_dom",$ldap_pass)) {
    echo "Sie sind angemeldet.";
    ldap_unbind($ldcon);
} else {
    echo "Das hat leider nicht geklappt.";
}
ldap_close($ldcon);
?>

Das ist natürlich ein sehr simples Beispiel und noch ohne einer PHP-Sitzung oder ähnlichem. Es zeigt aber, dass LDAP keine schwarze Magie ist.

Indes ist es etwas komplizierter, wenn man z. B. auf Mitgliedschaft in Gruppen prüfen möchte. Dafür braucht man außerdem die folgenden Funktionen:

Ein Beispiel, in dem ich davon ausgehe, dass eine Authentifizierung bereits stattgefunden hat – ich verwende die LDAP-Sitzungsnummer, $ldcon:

//Wonach wir suchen:
$filter="(samaccountname=$ldap_user)";
// Wo wir suchen (in der gesamten Domain, und zwar statt z. B. "meinedomain.local" in dem Format "DC=meinedomain,DC=local"):
$base="DC=".implode(",DC=",explode(".",$ldap_dom));
// Welche Information wir haben wollen:
$attributes=array("memberof");
// Und so sieht die Suche aus:
$ldsearch=ldap_search($ldcon,$base,$filter,$attributes);
// Da $ldsearch nicht die Ergebnisse als solche beinhaltet, sondern viel mehr einen Link, müssen wir jetzt aus dem LDAP unsere Ergebnisse abrufen:
$results=ldap_get_entires($ldcon,$ldsearch);
// Und jetzt gehen wir die Einträge durch (wir überspringen das erste Element, da dieses nur ein Counter ist):
echo "Sie sind Mitglied in den folgenden Gruppen:<ul>";
$i=0;
foreach($results[0]['memberof'] as $result) {
    if($i>0) echo "<li>".htmlentities($result)."</li>";
    $i++;
}
echo "</ul>";

Wie man sieht, ist auch das keine wirkliche schwarze Magie. Allerdings sollten die Einträge noch manipuliert werden, weil sie in dem Format sind:

CN=MeineGruppe,OU=Groups,DC=meinedomain,DC=local

Das ist natürlich idR. nicht brauchbar. Vor allem nicht für den Benutzer. Das reicht dennoch an dieser Stelle als Beispiel, wie man in PHP per LDAP gegen ein Active Directory authentifizieren kann.

Autor
Kategorien Coding, Scripting

PRTG Map