validación usuario tutorial petición para formulario directorio contraseña con autenticación aplicaciones activo active php authentication active-directory ldap

php - tutorial - Usar el directorio activo para autenticar usuarios en el sitio de intranet



login directorio activo php (2)

Esto es lo que uso:

<?php error_reporting(E_ALL); ini_set(''display_errors'', ''On''); define(''DOMAIN_FQDN'', ''mycompany.intra''); define(''LDAP_SERVER'', ''192.168.0.1''); if (isset($_POST[''submit''])) { $user = strip_tags($_POST[''username'']) .''@''. DOMAIN_FQDN; $pass = stripslashes($_POST[''password'']); $conn = ldap_connect("ldap://". LDAP_SERVER ."/"); if (!$conn) $err = ''Could not connect to LDAP server''; else { define(''LDAP_OPT_DIAGNOSTIC_MESSAGE'', 0x0032); ldap_set_option($conn, LDAP_OPT_PROTOCOL_VERSION, 3); ldap_set_option($conn, LDAP_OPT_REFERRALS, 0); $bind = @ldap_bind($conn, $user, $pass); ldap_get_option($conn, LDAP_OPT_DIAGNOSTIC_MESSAGE, $extended_error); if (!empty($extended_error)) { $errno = explode('','', $extended_error); $errno = $errno[2]; $errno = explode('' '', $errno); $errno = $errno[2]; $errno = intval($errno); if ($errno == 532) $err = ''Unable to login: Password expired''; } elseif ($bind) { $base_dn = array("CN=Users,DC=". join('',DC='', explode(''.'', DOMAIN_FQDN)), "OU=Users,OU=People,DC=". join('',DC='', explode(''.'', DOMAIN_FQDN))); $result = ldap_search(array($conn,$conn), $base_dn, "(cn=*)"); if (!count($result)) $err = ''Unable to login: ''. ldap_error($conn); else { foreach ($result as $res) { $info = ldap_get_entries($conn, $res); for ($i = 0; $i < $info[''count'']; $i++) { if (isset($info[$i][''userprincipalname'']) AND strtolower($info[$i][''userprincipalname''][0]) == strtolower($user)) { session_start(); $username = explode(''@'', $user); $_SESSION[''foo''] = ''bar''; // set session variables... break; } } } } } } // session OK, redirect to home page if (isset($_SESSION[''foo''])) { header(''Location: /''); exit(); } elseif (!isset($err)) $err = ''Unable to login: ''. ldap_error($conn); ldap_close($conn); } ?> <!DOCTYPE html><head><title>Login</title></head> <style> * { font-family: Calibri, Tahoma, Arial, sans-serif; } .errmsg { color: red; } #loginbox { font-size: 12px; } </style> <body> <div align="center"><img id="imghdr" src="/img/logo.png" height="100" /><br><br><h2>Login</h2><br><br> <div style="margin:10px 0;"></div> <div title="Login" style="width:400px" id="loginbox"> <div style="padding:10px 0 10px 60px"> <form action="/login.php" id="login" method="post"> <table><?php if (isset($err)) echo ''<tr><td colspan="2" class="errmsg">''. $err .''</td></tr>''; ?> <tr> <td>Login:</td> <td><input type="text" name="username" style="border: 1px solid #ccc;" autocomplete="off"/></td> </tr> <tr> <td>Password:</td> <td><input type="password" name="password" style="border: 1px solid #ccc;" autocomplete="off"/></td> </tr> </table> <input class="button" type="submit" name="submit" value="Login" /> </form> </div> </div> </div> </body></html>

Tengo un sitio ''intranet'' que he creado, que tiene un sistema de inicio de sesión propio (los usuarios se registran como nuevos usuarios y usan el nombre de usuario / contraseña para iniciar sesión en el sitio). Sin embargo, ahora quiero ampliarlo y hacer que el sitio de intranet use el ActiveDirectory existente para la autenticación. Esto es lo que estoy buscando, en el futuro -

Cuando un usuario accede a este sitio de intranet ( http://intranetsite/mySite ), las credenciales de dominio del usuario se validan contra el directorio activo, y si las credenciales del usuario coinciden con AD, se le presenta al usuario la página principal del sitio de intranet.

Soy nuevo en AD, y no sé cómo hacer esta configuración. Mi sitio de intranet se basa en PHP y usa Apache en el servidor de aplicaciones; el AD está en un servidor IIS diferente.

¿Qué información necesito y dónde pongo esta información (en mi sitio? Htaccess? En cualquier otro lugar) para poder usar la autenticación AD? ¿Es suficiente la "configuración", o tengo que escribir un código PHP explícito para esta autenticación?

Cualquier puntero es muy apreciado.


Si solo busca autenticación y nada más, puede salirse con unas pocas líneas de código.

Primero, asegúrese de tener habilitado ldap en su php.

Aquí está la implementación pura de php:
(tenga en cuenta que al hacerlo de esta manera, debe asegurarse de que USTED TENGA un nombre de usuario y una contraseña de un usuario; el enlace anónimo casi siempre retornará verdadero para AD).

$link = ldap_connect(''domain.com''); // Your domain or domain server if(! $link) { // Could not connect to server - handle error appropriately } ldap_set_option($link, LDAP_OPT_PROTOCOL_VERSION, 3); // Recommended for AD // Now try to authenticate with credentials provided by user if (! ldap_bind($link, ''[email protected]'', ''SomeSecret'')) { // Invalid credentials! Handle error appropriately } // Bind was successful - continue

Si espera hacer más cosas divertidas con Active Directory, como extraer algo de información sobre el usuario actualmente conectado, le recomiendo usar un marco para hacer el trabajo pesado por usted. Como ya se mencionó, adLDAP es bueno y si ejecuta PHP 5.4 me atrevo a recomendar la biblioteca AD-X que desarrollo activamente (puede instalarla a través de Composer).

Con la biblioteca AD-X, puede verificar las credenciales de un usuario utilizando este código:

try { $link = new ADX/Core/Link(''domain.com''); // Establish connection to AD $link->bind(''[email protected]'', ''SomeSecret''); // Authenticate user } catch (ADX/Core/ServerUnreachableException $e) { // Unable to connect to server, handle error } catch (ADX/Core/InvalidCredentialsException $e) { // Invalid credentials supplied } catch (Exception $e) { // Something else happened, check the exception and handle appropriately } // Successfully authenticated if no exception has been thrown

Siéntase libre de elegir lo que más le convenga. Sin embargo, si espera hacer algo más que autenticarse, le sugiero encarecidamente que use una biblioteca para el trabajo LDAP, le ahorrará mucho tiempo y posiblemente frustración cuando las cosas no funcionen como usted esperaría.

Además, si tiene dudas sobre qué información puede / debe usar para conectarse y autenticarse, no dude en consultar mi respuesta anterior sobre este tema.