PHP - Validar usuario con LDAP, usando otra credencial

 
Vista:

Validar usuario con LDAP, usando otra credencial

Publicado por Brinklo (1 intervención) el 24/12/2019 18:27:04
Buen día compañeros.

Después de mucho guglear me veo en la necesidad de postear mi duda, ya que no encuentro la solución a mi caso especifico.

Les cuento que estoy utilizando la función ldap_bind() de PHP para loguear a mis usuarios con Active Directory. Lo complicado es que necesito utilizar a un cierto usuario que tiene las credenciales correctas para poder realizar las consultas.

A continuación mi código, con algunas modificaciones de datos, obviamente:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
<?php
//Usuario y pass a través del método POST
$usuario_login = $_POST['nombre_usuario'];
$pass_login = $_POST['pass_usuario'];
 
//Usuario con credenciales para hacer consultas en AD
$usuario_LDAP = 'Admin';
$contrasena_LDAP = 'AdmindPass';
 
$servidor_LDAP = "100.10.100.1";
$servidor_dominio = "midominio.com.mx";
$ldap_dn = "dc=midominio,dc=com,dc=mx";
$puertoldap = 389;
 
$ldaprdn = trim($usuario_LDAP ).'@'.servidor_dominio ;
$usuarioBuscar = $usuario_login.'@'.servidor_dominio ;
 
$ldapconn = ldap_connect($servidor_LDAP ,$puertoldap);
ldap_set_option($ldapconn, LDAP_OPT_PROTOCOL_VERSION,3);
ldap_set_option($ldapconn, LDAP_OPT_REFERRALS,0);
 
$ldapbind = ldap_bind($ldapconn, $ldaprdn, $contrasena_LDAP);
 
if ($ldapbind){
     $filter = '(sAMAccountName='.$usuario_login.')';
     $attributes = array("name", "samaccountname");
     $result = ldap_search($ldapconn, $ldap_dn, $filter, $attributes);
     $entries = ldap_get_entries($ldapconn, $result);
     $userDN = $entries[0]["name"][0];
     echo ('<p style="color:green;">El DN del usuario: '.$userDN.'</p>');
 
      //Aquí he intentado la segunda búsqueda, con Usuario@midominio.com.mx y $userDN
     $ldapBindUser = ldap_bind($ldapconn, $usuarioBuscar, $pass_login);
     //$ldapBindUser = ldap_bind($ldapconn, $userDN, $pass_login);
 
     if($ldapBindUser){
          echo ("<p style='color: green;'>Usuario autentificado!!!</p>");
          ldap_unbind($ldapconn); // Clean up after ourselves.
     } else {
                echo ("<p style='color: red;'>Usuario no autentificado :(</p>");
       }
?>

El primer usuario si lo encuentra, pero ya el segundo no, me aparece un Warning: ldap_bind(): Unable to bind to server: Invalid credentials in...

Se que no es un tema común, pero agradecería cualquier consejo o comentario que me puedan dar...
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder
Imágen de perfil de José Manuel
Val: 150
Ha mantenido su posición en PHP (en relación al último mes)
Gráfica de PHP

Validar usuario con LDAP, usando otra credencial

Publicado por José Manuel (62 intervenciones) el 30/12/2019 10:05:23
Hola:

Imagino que ya te habrás mirado lo siguiente pero por si acaso:

- $usuarioBuscar y $userDN, ¿qué diferencia hay entre ellos? Dicho de otro modo, $userDN, ¿se ha construido igual que $usuarioBuscar?
- ¿las claves son las correctas todo el tiempo?
- ¿es seguro que el usuario tiene los permisos pertinentes?

Coméntanos, un saludo,
https://obelearningservices.com/blog/
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

Validar usuario con LDAP, usando otra credencial

Publicado por Brinklo (5 intervenciones) el 30/12/2019 20:40:02
Que tal José Manuel:

- El $usuarioBuscar es la cadena que yo formé con el usuario capturado en el formulario y le agregué el dominio. En el caso de $userDN es el DN que me regresa la búsqueda con ldap_search.

- En el caso de las claves, Incluso imprimo las contraseñas todo el tiempo, aunque ahora me surge la duda si tengo que aplicarle algún hash o algo así. Aunque sería raro, porque el primer usuario si se loguea correctamente con la contraseña en texto plano...

- Y de los permisos, el primero si tiene permisos para consultar, y la segunda validación la he probado con varios usuarios y en todas me aparece que no tengo las credenciales.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
Imágen de perfil de José Manuel
Val: 150
Ha mantenido su posición en PHP (en relación al último mes)
Gráfica de PHP

Validar usuario con LDAP, usando otra credencial

Publicado por José Manuel (62 intervenciones) el 30/12/2019 20:57:15
Hola:

No creo que sean las claves. Sobre los permisos, es algo que sería necesario descartar como problema. Para ello necesitarás una forma alternativa de saber si se tienen los necesarios, ¿algún administrador te puede indicar este dato?

Por otro lado, ¿has probado a buscar directamente con un usuario?, ¿sin consulta previa?

Lo siguiente que se me ocurre es insistir en el parámetro del usuario. La variable $usuarioBuscar la formas tú efectivamente. Insisto con esto aunque seguramente ya lo has hecho: ¿has confirmado que el DN devuelto por la búsqueda queda igual que $usuarioBuscar?

Finalmente, ¿puedes consultar el log de PHP?¿Tienes la posibilidad de analizar otros blogs? Si es así, quizás te indique un dato adicional que puedas utilizar.

A ver como sigue. Un saludo,
https://obelearningservices.com/blog/
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

Validar usuario con LDAP, usando otra credencial

Publicado por Brinklo (5 intervenciones) el 31/12/2019 18:50:55
Que tal...

Sí, ya revisé los permisos, incluso el administrador de redes ya intentó loguearse y sigue sin reconocer sus contraseñas.

También intenté la consulta directa del usuario, de hecho ese fue mi primer paso, y ahí me dí cuenta que se necesitaba pasar por el primer usuario.

El $usuarioBuscar he intentado crearlo de diversas formas:
1
2
3
4
$usuarioBuscar = $usuario_login;
$usuarioBuscar = $usuario_login.'@midominio.com.mx';
$usuarioBuscar = 'midominio.com.mx\\'.$usuario_login;
$usuarioBuscar = 'CN='.$usuario_login.',DC=midominio,DC=com,DC=mx';

Incluso como comenta Pedro más abajo, con el valor de DN que me regresa el ldap_search:

1
$usuarioBuscar = CN=Nombre de Usuario,OU=UnidadOrganizativa1,OU=UnidadOrganizativa2,OU=UnidadOrganizativa3,DC=midominio,DC=com,DC=mx

Pero sigue sin reconocerme las credenciales.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
Imágen de perfil de Pedro
Val: 119
Ha disminuido 1 puesto en PHP (en relación al último mes)
Gráfica de PHP

Validar usuario con LDAP, usando otra credencial

Publicado por Pedro (43 intervenciones) el 30/12/2019 22:07:10
Gracias por sacar este hilo me viene genial he podido comprender algo que desconocía y estoy trabajando con autenticación en Active Directory también.

No sé si te será de utilidad lo que voy a pasarte pero es una alternativa , ya que podrás hacer un var_dump al retorno de datos del arbol de directorio al que intentas buscar los usuarios.

Mira este thread de la página oficial de php en mi caso ha sido de gran ayuda,
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
1
Comentar

Validar usuario con LDAP, usando otra credencial

Publicado por Brinklo (5 intervenciones) el 31/12/2019 19:04:13
Efectivamente, ya imprimí en pantalla el valor que me regresa el ldap_search() y efectivamente me regresa el DN completo. Por lo que el usuario si lo está encontrando en el active directory.

El problema viene que al hacer el ldap_bind() con su contraseña me sigue regresando las credenciales inválidas.

Incluso como le comenté a José Manuel, ya hice la consulta con el DN completo, tal como me lo regresa la consulta. pero sigue sin reconocerme cuando intento utilizar la contraseña:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
if ($ldapbind){
    $filter = "(&(sAMAccountName=$usuario_login))";//'(sAMAccountName='.$usuario_login.')';
    $attributes = array("samaccountname");
    $result=ldap_search($ldapconn, $ldap_dn, $filter, $attributes);
    $entries = ldap_get_entries($ldapconn, $result);
 
    //var_dump($entries);
    //Valor que trae DN
    //DN = CN=Nombre de Usuario,OU=UnidadOrganizativa1,OU=UnidadOrganizativa2,OU=UnidadOrganizativa3,DC=midominio,DC=com,DC=mx
 
    $usuarioBuscar = $entries[0]["dn"];
 
    $ldapBindUser = ldap_bind($ldapconn, $usuarioBuscar, $pass_login);
    if($ldapBindUser){
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
Imágen de perfil de Pedro
Val: 119
Ha disminuido 1 puesto en PHP (en relación al último mes)
Gráfica de PHP

Validar usuario con LDAP, usando otra credencial

Publicado por Pedro (43 intervenciones) el 02/01/2020 20:23:47
Estoy en el mismo punto que tú yo creo que no lo estabamos haciendo bien, he estado hablando con un compañero más experto y me dice que el único que puede hacer consultas al Active Directory es el Admin, con lo cual me lleva a pensar que el algoritmo a nuestro problema es el siguiente:

1.-Logearnos con usuario Role Admin.
2.-Extraer los datos del árbol de directorio al que vamos a buscar al user y password --> meterlo en un array
3.-Y comprobar con una itineración si existe el usuario y password en los atributos de cada objeto usuario

Algo así por aquí van los tiros

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
//Hacemos la query al árbol donde están los usuarios
$result = ldap_search($ldapconn,$ldaptree, "(cn=*)") or die ("Error in search query: ".ldap_error($ldapconn));
//Metemos en la variable los resultados de la query
$data = ldap_get_entries($ldapconn, $result);
 
 
 
 
/*================================================>
  Y sabiendo el nombre de los atributos  de cada objeto
  Se realiza una itineración  y se busca el usuario y contraseña
=================================================>
*/
 
//Algo así Ejemplo 1
 
for ($i=0; $i<$data["count"]; $i++) {
    //echo "dn is: ". $data[$i]["dn"] ."<br />";
    echo "User: ". $data[$i]["cn"][0] ."<br />";
    if(isset($data[$i]["mail"][0])) {
        echo "Email: ". $data[$i]["mail"][0] ."<br /><br />";
    } else {
        echo "Email: None<br /><br />";
    }
}

En cuanto vuelva de vacaciones voy a probar esto que te menciono.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

Validar usuario con LDAP, usando otra credencial

Publicado por Brinklo (5 intervenciones) el 03/01/2020 18:03:12
Suena bien esa opción, incluso ya se me había ocurrido algo así, pero yo no he encontrado la manera de hacer que ldap_search() o ldap_compare() me regresen la contraseña para realizar esa comparación.

O tal vez te este entendiendo mal. Igual por las fechas yo también le estoy avanzando a otros asuntos. Voy a esperar a que hagas pruebas a ver si tu idea resulta.

Gracias...
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

Validar usuario con LDAP, usando otra credencial

Publicado por Brinklo (5 intervenciones) el 08/01/2020 18:39:32
Después de mucho buscar, no encontré mejor opción que utilizar una librería de Laravel: encontré dos opciones LdapRecord y Adldap2. Ambas son muy similares, yo opté por utilizar está última.

Al final mi archivo quedó así:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
<?php
//Agrega la librería ADLDAP2
require __DIR__.'/../vendor/autoload.php';
//Crea un objeto
$ad = new Adldap\Adldap();
//Usuario con credenciales para hacer consultas en AD
$usuario_LDAP = 'Admin';
$contrasena_LDAP = 'AdmindPass';
 
//Crea el arreglo con los datos de configuración
$config = [
    'hosts'            => ['100.10.100.1'],
    'base_dn'          => 'dc=midominio,dc=com,dc=mx',
    'username'         => $usuario_LDAP,
    'password'         => $contrasena_LDAP,
    'port'             => 389,
];
 
$servidor_dominio = "midominio.com.mx";
 
$connectionName = 'my-connection';
 
$ad->addProvider($config);
 
$ad->addProvider($config, $connectionName);
 
//Usuario y pass a través del método POST. El usuario que voy a buscar
$usuario_login = $_POST['nombre_usuario'];
$pass_login = $_POST['pass_usuario'];
try {
    //Se realiza la conexión con el usuario admin
    $provider = $ad->connect($connectionName, $usuario_LDAP, $contrasena_LDAP);
    // Great, we're connected!
        $username = $usuario_login.'@'.$servidor_dominio;
        $password = $pass_login;
 
        try {
            //Se realiza la búsqueda del usuario
            if ($provider->auth()->attempt($username, $password, $bindAsUser = true)) {
                session_start();
                $_SESSION["User"] = $usuario_login;
                echo"<script>window.location.href='menu_principal.php'; </script>";
            } else {
                // Failed.
                echo '<br>Error al identificarse';
            }
        } catch (Adldap\Auth\UsernameRequiredException $e) {
            // The user didn't supply a username.
            echo '<br>No se encuentra el Usuario';
        } catch (Adldap\Auth\PasswordRequiredException $e) {
            // The user didn't supply a password.
            echo '<br>La Contraseña No Es Correcta';
        }
 
 
} catch (Adldap\Auth\BindException $e) {
    // Failed to connect.
    echo '<br>Error al conectarse al Active Directory';
}

Espero que le sirva a alguien más.

Saludos y gracias por su atención.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
2
Comentar
Imágen de perfil de Pedro
Val: 119
Ha disminuido 1 puesto en PHP (en relación al último mes)
Gráfica de PHP

Validar usuario con LDAP, usando otra credencial

Publicado por Pedro (43 intervenciones) el 08/01/2020 20:08:47
Gracias por compartir la solución a tu problema seguro que será de utilidad a más gente.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
Imágen de perfil de José Manuel
Val: 150
Ha mantenido su posición en PHP (en relación al último mes)
Gráfica de PHP

Validar usuario con LDAP, usando otra credencial

Publicado por José Manuel (62 intervenciones) el 09/01/2020 09:48:08
Bien visto!!

Un tema muy interesante. No se si a ti te pasará igual pero sigo pensando en cuál sería realmente la causa del fallo. Gracias por compartir esta solución!!!

Un saludo,
https://obelearningservices.com/blog/
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar