Domanda

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.
È stato utile?

Soluzione

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, 

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

<*>POST['username'],

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

<*>POST['password'])) { // log them in! } else { // error message }

Altri suggerimenti

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

  • È necessario convalidare l'input. In caso contrario passerebbe un nome utente / una password vuoti.
  • È necessario assicurarsi che il nome utente / la password siano correttamente codificati durante l'associazione.
  • Dovresti crittografare la connessione usando 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à, nella maggior parte dei casi è più semplice utilizzare una libreria LDAP che supporta quanto sopra. Alla fine ho finito per girare la mia libreria che gestisce tutti i punti sopra: LdapTools (Beh, non solo per l'autenticazione , può fare molto di più). Può essere usato come il seguente:

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 autenticata sopra sarà:

  • Convalida che né il nome utente né la password sono vuoti.
  • Assicurati che il nome utente / la 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.
  • Fornire ulteriori informazioni in caso di errore (es. account bloccato / disabilitato, ecc.)

Ci sono anche altre librerie per fare questo (come Adldap2). Tuttavia, mi sono sentito abbastanza obbligato da fornire alcune informazioni aggiuntive in quanto la risposta più votata è in realtà un rischio per la sicurezza su cui fare affidamento senza convalida dell'input effettuata e non utilizzando TLS.

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.

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

PHP ha librerie: http://ca.php.net/ldap

PEAR ha anche una serie di pacchetti: http: // pear.php.net/search.php?q=ldap&in=packages&x=0&y=0

Neanche io l'ho usato, ma a un certo punto lo avrei fatto e sembra che dovrebbero funzionare.

Per coloro che cercano un esempio completo, consulta http://www.exchangecore.com/blog/how-use-ldap-active-directory-authentication-php/ .

Ho verificato questo collegamento a controller di dominio Windows Server 2003 e Windows Server 2008 R2 da un server Web Windows Server 2003 (IIS6) e da un'azienda Windows Server 2012 che esegue IIS 8.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top