Authentifizieren des Benutzers mit LDAP von PHP

Lesezeit: 4 Minuten

Mein Projekt ist es, ein Modulanmeldungssystem für unsere Universität zu erstellen. Also habe ich mich an die IT-Leute meiner Universität gewandt, um Einzelheiten zur Authentifizierung der Studenten im System zu erfahren. Wir entwickeln das System mit dem bestehenden Uni-Login weiter. Sie gaben mir einige LDAP-Informationen, ich weiß nicht, wie sie verwendet werden. Ich verwende PHP, MySQL auf einem Apache-Server. Wie kann ich einen Benutzer authentifizieren, der sich bei meinem System anmeldet, indem ich seine Benutzer-ID und sein Kennwort mit den LDAP-Informationen angibt.

Unten sind die LDAP-Informationen angegeben (ich habe den Domänennamen geändert usw.)

LDAP-Informationen für die Domäne blueroom.ac.uk


LDAP Host : ad.blueroom.ac.uk

LDAP port no: 389

BASE DN : ou=bluebird, dc=bluebird, dc=ac, dc=my

LDAP account to bind : cn = kikdap, ou=servacc, dc=bluebird,dc=ac,dc=uk

LDAP account password : ********

Attribute : sAMAccountName 

  • Wenn Ihr Server eine Linux-Box ist, können Sie ohne ein geeignetes Serverzertifikat nicht mit AD kommunizieren. Dies kann ein Problem sein, wenn Sie Hilfe von der Universität benötigen.

    Benutzer423756

    18. August 2010 um 8:29 Uhr

Benutzeravatar von Stefan Gehrig
Stefan Gehrig

Das allgemeine Verfahren wäre (relevante ext/ldap-php-Befehle in Klammern):

  1. Verbindung zum LDAP-Server über „LDAP-Host“ und „LDAP-Portnummer“ (ldap_connect()) und stellen Sie die richtigen Verbindungsoptionen ein (ldap_set_option()), besonders LDAP_OPT_PROTOCOL_VERSION und LDAP_OPT_REFERRALS

  2. Binden Sie mit dem „LDAP-Konto zum Binden“ und dem „LDAP-Kontopasswort“ an den LDAP-Server (ldap_bind()) – Wenn Sie sich bei einem Active Directory-Server authentifizieren, können Sie den Benutzernamen und das Kennwort direkt von der Anmeldeseite verwenden und alle folgenden Schritte überspringen.

  3. Durchsuchen Sie den Baum nach einem passenden Benutzereintrag/Objekt, indem Sie den “BASE DN” und den entsprechenden LDAP-Filter angeben – höchstwahrscheinlich so etwas wie (&(objectClass=user)(sAMAccountName=%s)) wo %s sollte durch den zu authentifizierenden Benutzernamen ersetzt werden (ldap_search())

  4. Prüfen Sie, ob die Anzahl der zurückgegebenen Einträge 1 ist (wenn <> 1, dann ist etwas schief gelaufen, z. B. kein Benutzer gefunden oder mehrere Benutzer gefunden)

  5. Rufen Sie den Distinguished Name (DN) dieses einzelnen Eintrags ab (ldap_get_dn())

  6. Verwenden Sie den im letzten Schritt gefundenen DN, um zu versuchen, sich mit dem auf der Authentifizierungsseite angegebenen Passwort an den LDAP-Server zu binden (ldap_bind())

  7. Wenn die Bindung erfolgreich ist, ist alles in Ordnung, wenn nicht, ist höchstwahrscheinlich das Passwort falsch

Es ist wirklich nicht so schwer, wie es sich zunächst anhört. Im Allgemeinen würde ich vorschlagen, eine Art Standardbibliothek für die Authentifizierung gegenüber einem LDAP-Server wie dem zu verwenden Net_LDAP2 PEAR-Paket bzw Zend_Ldap aus dem Zend-Framework. Ich habe keine Erfahrung mit der tatsächlichen Verwendung Net_LDAP2 (obwohl ich den Code recht gut kenne) aber Zend_Ldap funktioniert sehr gut mit Active Directory-Servern oder ADAMS-Servern (womit Sie offensichtlich arbeiten).

Dies wird den Trick mit tun Zend_Ldap:

$options = array(
    'host'                 => 'ad.blueroom.ac.uk',
    'useStartTls'          => true,
    'accountDomainName'    => 'blueroom.ac.uk',
    'accountCanonicalForm' => 4,
    'baseDn'               => 'ou=bluebird,dc=bluebird,dc=ac,dc=my',
);
$ldap = new Zend_Ldap($options);
try {
    $ldap->bind('user', 'password');
} catch (Zend_Ldap_Exception $e) {
    // something failed - inspect $e
}
// bind successful
$acctname = $ldap->getCanonicalAccountName('user', Zend_Ldap::ACCTNAME_FORM_DN);

  • Ich habe einfach einige Ihrer Schritte befolgt und es funktioniert wie ein Zauber … ging die Route des nativen PHP-LDAP-Moduls durch.

    – an_

    20. Februar 2014 um 11:19 Uhr

  • Nur ein Wort der Vorsicht an diejenigen, die diese Methode verwenden: Wenn Ihr LDAP-Server eine anonyme Anmeldung zulässt, stellen Sie sicher, dass Sie leere Passwörter als ungültig herausfiltern, bevor Sie eine Authentifizierung versuchen.

    – Tyzoid

    23. Juli 2014 um 18:53 Uhr

  • Ich authentifiziere mich bei einem Active Directory-Server, musste aber trotzdem alle Schritte bis 7 durchlaufen.

    – Jibby

    10. September 2015 um 20:51 Uhr

Du könntest es versuchen http://code.activestate.com/recipes/101525/ unter Bezugnahme auf http://us3.php.net/ldap und andere Ergebnisse einer Google-Suche nach [php ldap authentication].

@Stephen lieferte gute Punkte. Hier ist mein einfacher PHP-Code zur Authentifizierung mit AD:

  1. Zuerst müssen Sie diese Parameter kennen: Serverhost, Benutzerdomäne (Sie benötigen auch Basis-DN, wenn Sie AD abfragen möchten).
  2. verwenden Sie den folgenden Code:

    $ldap = ldap_connect($host); // e.g. 165.5.54.6 or an URL
    ldap_set_option($ldap, LDAP_OPT_PROTOCOL_VERSION, 3); // Recommended for AD
    ldap_set_option($ldap, LDAP_OPT_REFERRALS, 0);
    $bind = ldap_bind($ldap, $username.'@'.$userDomain, $passwrod);
    
    if($bind){
    // successful authentication. 
    }
    

  • Achtung: Einige Implementierungen von LDAP geben true on zurück ldap_bind wenn das Passwort leer ist. Du solltest möglicherweiße überprüfen Sie, dass das Passwort nicht leer ist.

    – Johann150

    19. Juli 2018 um 19:52 Uhr

Du könntest benutzen http://pear.php.net/package/Net_LDAP2/docs
es ist schön und funktioniert.

Beispiel für eine vom Dokument aufgenommene Verbindung:

// Inclusion of the Net_LDAP2 package:
require_once 'Net/LDAP.php';

// The configuration array:
$config = array (
    'binddn'    => 'cn=admin,ou=users,dc=example,dc=org',
    'bindpw'    => 'password',
    'basedn'    => 'dc=example,dc=org',
    'host'      => 'ldap.example.org'
);

// Connecting using the configuration:
$ldap = Net_LDAP2::connect($config);

// Testing for connection error
if (PEAR::isError($ldap)) {
    die('Could not connect to LDAP-server: '.$ldap->getMessage());
}

1407420cookie-checkAuthentifizieren des Benutzers mit LDAP von PHP

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy