usuarios - Autenticación en PHP usando LDAP a través de Active Directory
obtener datos de los usuarios de un servidor ldap con php (6)
Estoy buscando una manera de autenticar a los usuarios a través de LDAP con PHP (siendo Active Directory el proveedor). Idealmente, debería poder ejecutarse en IIS 7 ( adLDAP hace en Apache). ¿Alguien había hecho algo similar, con éxito?
- Editar: Prefiero una biblioteca / clase con código listo ... Sería una tontería inventar la rueda cuando alguien ya lo haya hecho.
La importación de una biblioteca completa parece ineficaz cuando todo lo que necesita 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
}
Lo hago simplemente pasando las credenciales de usuario a ldap_bind ().
http://php.net/manual/en/function.ldap-bind.php
Si la cuenta puede vincularse 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.
Me gusta la clase Zend_Ldap , puede usar solo esta clase en su proyecto, sin Zend Framework.
PHP tiene bibliotecas: http://ca.php.net/ldap
PEAR también tiene una serie de paquetes: http://pear.php.net/search.php?q=ldap&in=packages&x=0&y=0
No he usado ninguno de los dos, pero iba a hacerlo en un punto y me pareció que deberían funcionar.
Para aquellos que buscan un ejemplo completo visita http://www.exchangecore.com/blog/how-use-ldap-active-directory-authentication-php/ .
He probado esta conexión a los controladores de dominio de Windows Server 2003 y Windows Server 2008 R2 desde un servidor web Windows Server 2003 (IIS6) y desde una empresa de Windows Server 2012 que ejecuta IIS 8.
Uno pensaría 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é codificado correctamente cuando se enlace.
- Debería encriptar la conexión usando TLS.
- Usar servidores LDAP separados para la redundancia en caso de que uno esté inactivo.
- Obteniendo un mensaje de error informativo si falla la autenticación.
En realidad, es más fácil en la mayoría de los casos utilizar una biblioteca LDAP que respalde lo anterior. Finalmente terminé robando mi propia biblioteca que maneja todos los puntos anteriores: LdapTools (Bueno, no solo para autenticación, puede hacer mucho más). Se puede usar de la siguiente manera:
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 de autenticación anterior:
- Valide que ni el nombre de usuario ni la contraseña están vacíos.
- 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.
- Cifre la solicitud de autenticación usando TLS.
- Proporcione información adicional si falló (es decir, cuenta bloqueada / deshabilitada, etc.)
Hay otras bibliotecas para hacer esto también (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.