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. De lo contrario, pasaría un nombre de usuario / contraseña vacío.
- Debe asegurarse de que el nombre de usuario / contraseña esté codificado correctamente al realizar el enlace.
- Debería cifrar la conexión mediante TLS.
- Usar servidores LDAP separados para redundancia en caso de que uno no funcione.
- Recibiendo un mensaje de error informativo si falla la autenticación.
De hecho, en la mayoría de los casos es más fácil utilizar una biblioteca LDAP que admita lo anterior. Finalmente terminé lanzando mi propia biblioteca que maneja todos los puntos anteriores: LdapTools (Bueno, no solo para la 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 por defecto)
- Pruebe con un servidor LDAP alternativo en caso de que uno no funcione.
- Cifre la solicitud de autenticación mediante TLS.
- Proporcione información adicional si falló (es decir, cuenta bloqueada / deshabilitada, etc.)
También hay otras bibliotecas para hacer esto (como Adldap2). Sin embargo, me sentí lo suficientemente obligado a proporcionar información adicional ya que la respuesta más votada es en realidad un riesgo de seguridad en el que confiar sin validación de entrada y sin usar TLS.