Sie würden denken, dass die einfache Authentifizierung eines Benutzers in Active Directory ein ziemlich einfacher Prozess mit LDAP in PHP wäre, ohne dass eine Bibliothek erforderlich wäre. Aber es gibt viele Dinge, die es ziemlich schnell komplizieren können:
- Sie müssen die Eingabe validieren. Ein leerer Benutzername / Passwort würde sonst übergeben.
- Sie sollten sicherstellen, dass der Benutzername / das Passwort beim Binden ordnungsgemäß codiert ist.
- Sie sollten die Verbindung mit TLS verschlüsseln.
- Verwendung separater LDAP-Server für Redundanz, falls einer ausfällt.
- Eine informative Fehlermeldung erhalten, wenn die Authentifizierung fehlschlägt.
In den meisten Fällen ist es tatsächlich einfacher, eine LDAP-Bibliothek zu verwenden, die die oben genannten Funktionen unterstützt. Am Ende habe ich meine eigene Bibliothek gerollt , die alle oben genannten Punkte behandelt: LdapTools (Nun, nicht nur zur Authentifizierung, es kann noch viel mehr). Es kann wie folgt verwendet werden:
use LdapTools\Configuration;
use LdapTools\DomainConfiguration;
use LdapTools\LdapManager;
$domain = (new DomainConfiguration('example.com'))
->setUsername('username') # A separate AD service account used by your app
->setPassword('password')
->setServers(['dc1', 'dc2', 'dc3'])
->setUseTls(true);
$config = new Configuration($domain);
$ldap = new LdapManager($config);
if (!$ldap->authenticate($username, $password, $message)) {
echo "Error: $message";
} else {
// Do something...
}
Der obige Authentifizierungsaufruf wird:
- Stellen Sie sicher, dass weder der Benutzername noch das Passwort leer sind.
- Stellen Sie sicher, dass der Benutzername / das Kennwort ordnungsgemäß codiert ist (standardmäßig UTF-8).
- Versuchen Sie es mit einem alternativen LDAP-Server, falls einer ausfällt.
- Verschlüsseln Sie die Authentifizierungsanforderung mit TLS.
- Geben Sie zusätzliche Informationen an, wenn dies fehlgeschlagen ist (z. B. gesperrtes / deaktiviertes Konto usw.).
Es gibt auch andere Bibliotheken, die dies tun (z. B. Adldap2). Ich fühlte mich jedoch gezwungen genug, einige zusätzliche Informationen bereitzustellen, da die am besten bewertete Antwort tatsächlich ein Sicherheitsrisiko darstellt, auf das ich mich verlassen kann, wenn keine Eingabevalidierung durchgeführt wird und kein TLS verwendet wird.