it-swarm.com.de

Authentifizierung in PHP mit LDAP über Active Directory

Ich suche nach einer Möglichkeit, Benutzer über LDAP mit PHP (mit Active Directory als Anbieter) zu authentifizieren. Idealerweise sollte es auf IIS) ausgeführt werden können = 7 ( adLDAP funktioniert es auf Apache). Hat jemand etwas ähnliches getan, mit Erfolg?

  • Bearbeiten: Ich würde eine Bibliothek/Klasse mit Code bevorzugen, die bereit ist zu gehen ... Es wäre dumm, das Rad zu erfinden, wenn jemand dies bereits getan hat.
101
DV.

Das Importieren einer ganzen Bibliothek scheint ineffizient zu sein, wenn Sie lediglich zwei Codezeilen benötigen ...

$ldap = ldap_connect("ldap.example.com");
if ($bind = ldap_bind($ldap, $_POST['username'], $_POST['password'])) {
  // log them in!
} else {
  // error message
}
162
ceejayoz

Sie würden denken, dass die einfache Authentifizierung eines Benutzers in Active Directory mit LDAP in PHP ohne die Notwendigkeit einer Bibliothek ziemlich einfach wäre. Es gibt jedoch eine Menge Dinge, die es ziemlich schnell komplizieren können :

  • Sie müssen die Eingabe validieren. Ein leerer Benutzername/Passwort würde sonst passieren.
  • Sie sollten sicherstellen, dass der Benutzername/das Passwort beim Binden richtig verschlüsselt ist.
  • Sie sollten die Verbindung mit TLS verschlüsseln.
  • Verwenden separater LDAP-Server für Redundanz, falls einer ausfällt.
  • Erhalten einer informativen Fehlermeldung, wenn die Authentifizierung fehlschlägt.

In den meisten Fällen ist es sogar einfacher, eine LDAP-Bibliothek zu verwenden, die die oben genannten Funktionen unterstützt. Letztendlich habe ich meine eigene Bibliothek gerollt, die alle oben genannten Punkte behandelt: LdapTools (Nun, nicht nur zur Authentifizierung, sie kann 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 Authentifizierungsanruf wird:

  • Vergewissern Sie sich, dass weder Benutzername noch Passwort leer sind.
  • Stellen Sie sicher, dass der Benutzername/das Kennwort richtig 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, um dies zu tun (wie Adldap2). Ich fühlte mich jedoch gezwungen, einige zusätzliche Informationen bereitzustellen, da die am häufigsten gewählte Antwort tatsächlich ein Sicherheitsrisiko darstellt, auf das ich mich verlassen kann, wenn keine Eingabevalidierung erfolgt und kein TLS verwendet wird.

14
ChadSikorra

Dazu übergebe ich einfach die Benutzeranmeldeinformationen an ldap_bind ().

http://php.net/manual/en/function.ldap-bind.php

Wenn das Konto an LDAP gebunden werden kann, ist es gültig. Wenn es nicht geht, geht es nicht. Wenn Sie nur die Authentifizierung (nicht die Kontoverwaltung) durchführen, sehe ich keine Notwendigkeit für eine Bibliothek.

11
Scott Reynen

Ich mag die Zend_Ldap Klasse, Sie können nur diese Klasse in Ihrem Projekt verwenden, ohne das Zend Framework.

9
CMS

PHP hat Bibliotheken: http://ca.php.net/ldap

PEAR hat auch eine Reihe von Paketen: http://pear.php.net/search.php?q=ldapin=packagesx=0y=

Ich habe es auch nicht benutzt, aber ich wollte es irgendwann und sie schienen so, als sollten sie funktionieren.

6
Darryl Hein

Wenn Sie ein vollständiges Beispiel suchen, lesen Sie http://www.exchangecore.com/blog/how-use-ldap-active-directory-authentication-php/ .

Ich habe diese Verbindung mit Windows Server 2003- und Windows Server 2008 R2-Domänencontrollern von einem Windows Server 2003-Webserver (IIS6) und von einem Windows Server 2012-Unternehmen aus getestet, auf dem IIS 8 ausgeführt wird.

5
Joe Meyer