mercredi 1 avril 2009
Comment effectuer une identification d'un utilisateur Active Directory en PHP via LDAP
Par Sébastien Marinier, mercredi 1 avril 2009 à 20:10 // PHP
Si vous arrivez ici, c'est que sans doute vous avez comme moi cherché sur Internet comment effectuer une authentification en LDAP sur une base Active Directory, en PHP. Difficile car on trouve beaucoup de bruit avec ces termes !
Voici ce que j'ai fini par écrire. Le principe essentiel est d'effectuer une recherche du DN, puis de re-effectuer un "ldap_bind". Si cela ne fonctionne pas dans votre cas, faites le moi savoir via les commentaires!
Le petit bout de code:
// modify these values
define("LDAP_HOSTNAME","192.168.0.10"); // LDAP server
define("LDAP_DN", "DC=xx,DC=yy,DC=zz"); // LDAP DN
define("LDAP_CN", "admin"); // LDAP admin name
define("LDAP_CN_PASS", "password"); // LDAP admin password
function LDAP_identify( $login, $password) {
$ldaprdn = 'CN='.LDAP_CN.",CN=Users,".LDAP_DN; // DN ou RDN LDAP
$ldappass = LDAP_CN_PASS; // admin password
$ld = ldap_connect( LDAP_HOSTNAME);
if (!$ld) {
echo "Can't connect on LDAP server";
return false;
}
ldap_set_option($ld, LDAP_OPT_PROTOCOL_VERSION, 3);
ldap_set_option($ld, LDAP_OPT_REFERRALS, 0);
if (!ldap_bind( $ld, $ldaprdn, $ldappass)) {
echo "Can't identify on LDAP server";
ldap_close( $ld);
return false;
}
$r=ldap_search($ld, LDAP_DN, "(sAMAccountName=$login)");
$info = ldap_get_entries( $ld, $r);
if ($info) {
/*
** If you want to get some info
$id = $fullName = $mail = '';
if (isset($info[0]['sn'])) $id =$info[0]['sn'][0];
if (isset($info[0]['cn'])) $fullName =$info[0]['cn'][0];
if (isset($info[0]['mail'])) $mail =$info[0]['mail'][0];
*/
$DN = '';
if (isset($info[0]['dn'])) $DN =$info[0]['dn'];
// Active Directory accept empty password !?
$password = trim($password);
if (empty($password) || empty($DN) || !ldap_bind( $ld, $DN, $password)) {
echo "Erreur d'identification";
ldap_close( $ld);
return false;
}
// here, you're identified
ldap_close($ld);
return true;
}
ldap_close( $ld);
return false;
}
