Autenticazione in PHP utilizzando LDAP tramite Active Directory


104

Sto cercando un modo per autenticare gli utenti tramite LDAP con PHP (con Active Directory come provider). Idealmente, dovrebbe essere in grado di funzionare su IIS 7 ( adLDAP lo fa su Apache). Qualcuno aveva fatto qualcosa di simile, con successo?

  • Modifica: preferirei una libreria / classe con codice pronto per l'uso ... Sarebbe sciocco inventare la ruota quando qualcuno lo ha già fatto.

Penso che drupal abbia un modulo per thatr
redben

Risposte:


167

L'importazione di un'intera libreria sembra inefficiente quando tutto ciò di cui hai bisogno sono essenzialmente due righe di codice ...

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

43
Alcune installazioni di AD verranno associate correttamente se la password fornita è vuota. Attento a questo! Potrebbe essere necessario garantire una password non vuota prima di tentare l'autenticazione.
diolemo

@diolemo C'è un modo per impedirlo senza controllare se la password è vuota?
Naftali aka Neal

@Neal Potresti essere in grado di usarlo ldap_set_optionper farlo comportare in modo diverso. Forse impostando la versione del protocollo? Dovrai sperimentare. Ti suggerirei comunque di verificare la presenza di una password vuota, solo per sicurezza.
diolemo


Per l'editor anonimo: no, per quanto ne so, la sanificazione dell'input non è richiesta qui come ldap_bindsarebbe gestirla ei caratteri speciali non sono un problema.
ceejayoz

14

Penseresti che la semplice autenticazione di un utente in Active Directory sarebbe un processo piuttosto semplice utilizzando LDAP in PHP senza la necessità di una libreria. Ma ci sono molte cose che possono complicarlo abbastanza velocemente:

  • È necessario convalidare l'input. Altrimenti passerebbero un nome utente / password vuoti.
  • È necessario assicurarsi che il nome utente / la password siano codificati correttamente durante il collegamento.
  • Dovresti crittografare la connessione utilizzando TLS.
  • Utilizzo di server LDAP separati per la ridondanza nel caso in cui uno sia inattivo.
  • Ricezione di un messaggio di errore informativo se l'autenticazione non riesce.

In realtà è più facile nella maggior parte dei casi utilizzare una libreria LDAP che supporti quanto sopra. Alla fine ho finito per creare la mia libreria che gestisce tutti i punti precedenti: LdapTools (Beh, non solo per l'autenticazione, può fare molto di più). Può essere utilizzato come segue:

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...
}

La chiamata di autenticazione sopra:

  • Verifica che né il nome utente né la password siano vuoti.
  • Assicurati che il nome utente / password siano codificati correttamente (UTF-8 per impostazione predefinita)
  • Prova un server LDAP alternativo nel caso in cui uno sia inattivo.
  • Crittografa la richiesta di autenticazione utilizzando TLS.
  • Fornisci ulteriori informazioni in caso di errore (es. Account bloccato / disabilitato, ecc.)

Ci sono anche altre librerie per farlo (come Adldap2). Tuttavia, mi sono sentito abbastanza obbligato a fornire alcune informazioni aggiuntive poiché la risposta più votata è in realtà un rischio per la sicurezza su cui fare affidamento senza alcuna convalida dell'input e senza l'utilizzo di TLS.


1
Per le connessioni LDAP, TLS è stato deprecato a favore di StartTLS: openldap.org/faq/data/cache/605.html .
zenlord

2
@zenlord L'utilizzo del ldaps://formato per la connessione è deprecato. Nel mio esempio, quando specifichi setUseTls(true)utilizza il ldap://formato e quindi emette un StartTLS utilizzando ldap_start_tls($connection). Quindi TLS stesso non è stato deprecato, si collega semplicemente utilizzando ldaps://(che in realtà si connette a LDAP su una porta completamente diversa).
CiadSikorra

12

Lo faccio semplicemente passando le credenziali dell'utente a ldap_bind ().

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

Se l'account può essere associato a LDAP, è valido; se non può, non lo è. Se tutto ciò che stai facendo è l'autenticazione (non la gestione dell'account), non vedo la necessità di una libreria.


9

Mi piace la classe Zend_Ldap , puoi usare solo questa classe nel tuo progetto, senza Zend Framework.


1
Ho provato a implementare quanto sopra per scoprire che era per la gestione e non per l'autenticazione. Ho intenzione di passare a zend.auth.adapter.ldap
vdidxho


Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.