2009-02-13 28 views
35

Il mio progetto è di creare un sistema di registrazione dei moduli per la nostra università. Così ho contattato le persone IT della mia università per i dettagli per autenticare gli studenti nel sistema. Stiamo sviluppando il sistema utilizzando l'accesso all'università esistente. Mi hanno dato alcune informazioni LDAP, non ne conosco l'utilizzo. Sto usando PHP, Mysql su un server Apacha. Come posso autenticare un utente che accede al mio sistema, dato il suo userid e password con le informazioni LDAP.Autenticazione utente tramite LDAP da PHP

Dato che segue è le informazioni LDAP (ho cambiato il nome di dominio, ecc)

informazioni LDAP per il dominio 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 
+0

Se il server è una macchina Linux, non sarà in grado di parlare con dC senza un certificato server appropriato. Questo può essere un problema se hai bisogno di un aiuto dall'Univerità. –

risposta

52

La procedura generale sarebbe (relativi comandi php ext/LDAP tra parentesi):

  1. connettersi al server LDAP utilizzando il "Host LDAP" e "no porta LDAP" (ldap_connect()) e impostare la corretta possibilità di collegamento (ldap_set_option()), in particolare LDAP_OPT_PROTOCOL_VERSION e LDAP_OPT_REFERRALS

  2. legano al server LDAP utilizzando il "account LDAP per legare" e "password di account LDAP" (ldap_bind()) - se si sta autenticazione contro un server Active Directory è possibile direttamente usa l'u nome utente e password dalla pagina di accesso e saltare tutti i passaggi seguenti.

  3. cercare l'albero per un utente corrispondente di entrata/oggetto specificando il "DN base" e il filtro LDAP appropriata - molto probabilmente qualcosa di simile (&(objectClass=user)(sAMAccountName=%s)) dove %s dovrebbe essere sostituito dal nome utente per l'autenticazione (ldap_search())

  4. controllo se il numero di voci restituite è 1 (se <> 1 allora qualcosa è andato storto, ad esempio, nessun utente ha trovato o più utenti trovato)

  5. retrive il nome distinto (DN) di questa singola voce (ldap_get_dn())

  6. utilizzare il DN trovato nell'ultimo passaggio per cercare di collegarsi al server LDAP con la password data alla pagina di autenticazione (ldap_bind())

  7. se l'associazione ha esito positivo allora tutto è OK, se non, molto probabilmente la password è errata

All'inizio non è così difficile come sembra. Generalmente proporrei di utilizzare una sorta di libreria standard per l'autenticazione su un server LDAP come il pacchetto PEAR Net_LDAP2 o Zend_Ldap dello Zend Framework. Non ho esperienza con l'utilizzo effettivo di Net_LDAP2 (anche se conosco abbastanza bene il codice) ma lo Zend_Ldap funziona molto bene contro server Active Directory o server ADAMS (che è ovviamente quello con cui stai lavorando).

questo farà il trucco utilizzando 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); 
+0

Hai appena seguito alcuni dei tuoi passi e hai funzionato come un incantesimo ... è passato il percorso del modulo LDAP PHP nativo. –

+0

Solo una parola di cautela per coloro che utilizzano questo metodo: se il tuo server LDAP consente l'accesso anonimo, assicurati di filtrare le password vuote come non valide prima di tentare l'autenticazione. – Tyzoid

+0

Sto autenticandomi con un server di Active Directory, ma dovevo comunque passare tutti i passaggi a 7. – Jibbyj

2

si potrebbe usare http://pear.php.net/package/Net_LDAP2/docs è bello e lavora.

Esempio di collegamento presa dal doc:

// 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()); 
} 
1

@Stephen fornito buoni punti. Ecco il mio semplice codice PHP per autenticarsi usando AD:

  1. per prima cosa è necessario conoscere questi parametri: server host, dominio utente (è necessario anche dn di base se si desidera query AD).
  2. utilizzare il seguente codice:

    $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. 
    } 
    
Problemi correlati