2008-10-05 34 views
93

Estoy buscando una forma de autenticar usuarios a través de LDAP con PHP (siendo Active Directory el proveedor). Idealmente, debería poder ejecutarse en IIS 7 (adLDAP lo hace en Apache). ¿Alguien había hecho algo similar, con éxito?Autenticando en PHP usando LDAP a través del Directorio Activo

  • Editar: Preferiría una biblioteca/clase con el código listo ... Será una tontería inventar la rueda cuando alguien ya lo haya hecho.
+0

Creo que drupal tiene un módulo para thatr – redben

Respuesta

147

Importación de una biblioteca entera parece ineficaz cuando todos lo que es esencialmente dos líneas de código ...

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

Algunas instalaciones de AD se vincularán correctamente si la contraseña proporcionada está vacía. ¡Se cuidadoso con esto! Es posible que deba asegurarse de tener una contraseña no vacía antes de intentar la autenticación. – diolemo

+0

@diolemo ¿Hay alguna manera de evitar esto sin verificar si la contraseña está vacía? – Neal

+0

@Neal Es posible que pueda usar 'ldap_set_option' para que se comporte de una manera diferente. Tal vez establecer la versión del protocolo? Tendrás que experimentar Personalmente, le sugiero que busque una contraseña vacía, solo para estar seguro. – diolemo

8

Me gusta la clase , puede usar solo esta clase en su proyecto, sin Zend Framework.

11

Hago esto simplemente pasando las credenciales de usuario a ldap_bind().

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

Si la cuenta se puede unir a LDAP, es válida; si no puede, no lo es. Si todo lo que estás haciendo es autenticación (no gestión de cuentas), no veo la necesidad de una biblioteca.

11

Se podría pensar que simplemente autenticar a un usuario en Active Directory sería un proceso bastante simple usando LDAP en PHP sin la necesidad de una biblioteca. Pero hay muchas cosas que pueden complicarlo bastante rápido:

  • Debe validar la entrada. Un nombre de usuario/contraseña vacío pasaría de otra manera.
  • Debe asegurarse de que el nombre de usuario/contraseña esté correctamente codificado durante el enlace.
  • Debe cifrar la conexión mediante TLS.
  • Uso de servidores LDAP separados para la redundancia en caso de que uno se caiga.
  • Obteniendo un mensaje de error informativo si la autenticación falla.

En la mayoría de los casos, es más fácil utilizar una biblioteca LDAP que admita lo anterior. Finalmente terminé de rodar mi propia biblioteca que maneja todos los puntos anteriores: LdapTools (Bueno, no solo para autenticación, puede hacer mucho más).Puede ser utilizado como la siguiente:

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 llamada anterior se autentican:

  • Validar que ni el nombre de usuario o contraseña está vacía.
  • Asegúrese de que el nombre de usuario/contraseña esté codificado correctamente (UTF-8 de manera predeterminada)
  • Pruebe con un servidor LDAP alternativo en caso de que uno esté inactivo.
  • Encripte la solicitud de autenticación utilizando TLS.
  • proporcionar información adicional si fallaba (es decir. Bloqueada/cuenta desactivada, etc)

Hay otras bibliotecas que hacer esto también (Tales como Adldap2). Sin embargo, me sentí lo suficientemente compelido como para proporcionar información adicional, ya que la respuesta más votada es en realidad un riesgo de seguridad del que no se puede validar la entrada ni utilizar TLS.

+1

Para las conexiones LDAP, TLS ha quedado en desuso en favor de StartTLS: http://www.openldap.org/faq /data/cache/605.html. – zenlord

+1

@zenlord El uso del formato 'ldaps: //' para la conexión está en desuso. En mi ejemplo, cuando especifica 'setUseTls (true)' usa el formato 'ldap: //' y luego emite un StartTLS usando 'ldap_start_tls ($ connection)'. Por lo tanto, TLS no se ha desaprobado, simplemente se conecta usando 'ldaps: //' (que en realidad se conecta a LDAP en un puerto completamente diferente). – ChadSikorra

Cuestiones relacionadas