Pb d'authentification ldap

Signaler
Messages postés
2
Date d'inscription
lundi 19 avril 2004
Statut
Membre
Dernière intervention
11 mai 2004
-
Messages postés
4
Date d'inscription
dimanche 11 avril 2010
Statut
Membre
Dernière intervention
3 juin 2013
-
Salut à tous,

Voila, j'ai un gros problème en php. J'essaye de me connecter depuis un serveur apache sous linux à l'annuaire LDAP d'un serveur de domaine windows.
J'ai suivi pas mal de tutoriaux sur le net pour pouvoir me connecter mais je n'arrive pas à m'authetifier avec un mot de passe.
Apparament, je ne fais pas appel au bon objet. Enfin, j'en sais rien.

Voici mon petit code :

$server = "ldap://adr_srv_win";
$port = "389";
$chaine = "dc=XXX,dc=XXX,dc=fr";
$login = "cn=administrateur,cn=users,dc=XXX,dc=XXX,dc=fr";
$pass = "XXX";
$login1 = "CN=XXX,OU=XXX,OU=XXX,OU=XXX,DC=XXX,DC=XXX,DC=fr";
$password = "XXX";
echo "Connexion LDAP...
";
$ds = ldap_connect($server);
if($ds!=0)
{
$r = ldap_bind($ds,$login,$pass);
if($r)
{
echo "authentifié !!!
";
echo "Récupération des entrées :
";
$filtre="(|(sn=$personn*)(cn=$personn*)(userPassword=$personn*)(ntpassword=$personn*))";
$restriction = array("cn","sn","mail","userPassword","ntpassword");
$sr = ldap_search($ds,$chaine,"distinguishedName=".$login1."");
$nombre = ldap_count_entries($ds,$sr);
print $nombre." enregistrements trouvés
";
print("Récupération des entrées...
");
$info = ldap_get_entries($ds,$sr);
for($i=0;$i<$info["count"];$i++)
{
echo "nom (sn): ".$info[$i]["sn"][0]."
";
echo "Prénom (cn): ".$info[$i]["cn"][0]."
";
echo "Password : ".$info[$i]["ntpassword"][0]."
";//marche pas !!!!!
}
else
{
echo "echec authentification";
}
echo "Déconnexion
";
ldap_close($ds);
}

le problème est que pour identifier une personne, il faut login et mot de passe. En l'occurence, je suis incapable de retrouver le mot de passe. Si quelqu'un sait comment faire...

Merci d'avance

Sig
sigfridcecillon@cira-concept.fr

5 réponses

Messages postés
127
Date d'inscription
mercredi 18 juillet 2001
Statut
Membre
Dernière intervention
27 octobre 2004

Pour identifier une personne, la solution simple est la suivante :
se connecter en admin pour trouver le dn correspondant au login de l'utilisateur, puis faire un bind avec son dn et son mot de passe.

sinon, pour les mots de passe ldap, ils sont stockés sur 2 champs :
lmPassword et ntPassword

Cordialement,

ADPro22
Messages postés
2
Date d'inscription
lundi 19 avril 2004
Statut
Membre
Dernière intervention
11 mai 2004

j'essaye de rentrer les champs lmPassword et ntPassword
mais dans les deux cas, je n'arrive pas à accèder aux mots de passe.

Est ce qu'il y aurait pas quelque chose à faire sur le serveur de domaine windows ou sur Linux pour pouvoir y accèder ?

Merci pour tout,

Sig
sigfridcecillon@cira-concept.fr
Messages postés
13
Date d'inscription
jeudi 8 avril 2004
Statut
Membre
Dernière intervention
4 juin 2004

Bonjour,

voici une page de login que j'ai fais il y a un petit moment avec identification ldap, je pense qu'elle peut t'aider.
Bon courage.

require 'globals.php';
$error_login = false;
$titre = $string_lang['CLINET_TITLE'][$lang] ;

if( !isset($PHP_AUTH_USER) ) {
/* Aucune session n'est ouverte : on affiche la demande d'autentification */
   	header( "WWW-Authenticate: Basic realm="$titre""); 
header( "HTTP/1.0 401 Unauthorized");
echo "\n";
echo "Accès refusé suite à abandon \n";
echo "
\n";
echo "Cliquez ici pour vous identifier de nouveau";
echo "

\n";
    exit;
} else {
/* aucune session ouverte on vérifie les paramètres de connexion envoyés */
 	//require 'tools_ldap.php'; 
/* ne marche pas espace, ligne vide et header */

//Variable conditionnant l'identification' 
// $droit_user  null 	(user+password incorrect ) 	=> se reidentifier
//				1	 	(pas de password ou 
//						password et pas bon groupe )=> visu seulement
//				2		(password et bon groupe )	=> maj

//Connexion au serveur LDAP
//	$ldapconn = ldap_con($LDAP) ; // si tools_ldap est ok mais non !
//Connexion au serveur LDAP
$ldapconn = ldap_connect( $LDAP['host'], $LDAP['port'] )
           or die( "Impossible de se connecter au serveur LDAP {$LDAP['host']}" );

if ($ldapconn) 	{ 
if ($PHP_AUTH_PW == NULL) 		{
// password null donc connexion anonyme
$droit_user = 1 ;
$ok = TRUE ;
} else {
// on determine la liste des ou dans laquelle rechercher les connexions
//$ldap_ou = ldap_list_unit($LDAP, $ldapconn) ; 
// si tools_ldap est ok mais non !
//////////////////////////////////////////
/// pas génial, ici copie du corps de la fonction ldap_list_unit de tools_ldap
///
///  RECHERCHE de tous les 'ou' de l'annuaire, stockés dans $ldap_ou[]
///
$ldap_incorrect[] = "ou=RESEAU" ;
$ldap_incorrect[] = "ou=Postesdetravail" ;
$ldap_incorrect[] = "ou=SLPDEFAULT" ;
$ldap_incorrect[] = "ou=WebAccess" ;
$ldap_incorrect[] = "ou=Software" ;
$ldap_incorrect[] = "ou=APPLICATIONS" ;

if ($ldapconn) { 
//Connexion au serveur LDAP anonyme 
 	$ldapbind = @ldap_bind($ldapconn);    
// le @ pour masquer les messages retour 
if ($ldapbind )	{
// bind reussi, reste à connaitre TOUS LES OU
// on reinitialise le tableau existant
unset($ldap_ou) ;
// et on rajoute la racine, cas des users admins ldap
$ldap_ou[] = $LDAP['racine'] ;
$filtre =  "objectclass=organizationalUnit" ;
$colonnes = array( "ou") ;
$cn = $LDAP['racine'] ;
    $ldapsearch = ldap_search($ldapconn, $cn, $filtre, $colonnes ); 
//		    if ( $ldapsearch == FALSE ) {  echo "Ldap search incorrect" ; 	} 

    $info = ldap_get_entries($ldapconn, $ldapsearch); 
   	    for ($i=0;$i<$info["count"];$i++)        	{ 
$atraiter = TRUE ;
 		// il faut éliminer certains ou
foreach ( $ldap_incorrect as $ou )			{
if ( substr_count($info[$i]["dn"],$ou) != 0 )				{
$atraiter = FALSE ;
break ;
}
} 
if ( $atraiter ) {
$ldap_ou[] =  $info[$i]["dn"];
}
        }   // fin boucle analyse des ou
}  // fin ldapbind true
}  // fin if ldapconn

////////////////////////////////////////
//Connexion au serveur LDAP non anonyme puisque user et password connu
 	// on teste la connexion user sur chaque ou, on sort au premier réussi
$ok = FALSE ;
foreach ( $ldap_ou as $ou )	{
$cn = "cn=".$PHP_AUTH_USER.",".$ou ;
    //$racine = $ou.",o=GDB" ; pour un search tous agents
 	$ldapbind = @ldap_bind($ldapconn, $cn ,$PHP_AUTH_PW);    
// le @ pour masquer les messages retour 
if ($ldapbind ) {
//echo "connexion reussie sur ".$cn."
" ;
$ok = TRUE ;
break ;
}
} 

if ( !$ok ) 	{
$droit_user = NULL ;
// il faut se reidentifier
} else {
// bind reussi, reste à connaitre les groupes
    // utiliser racine tous agents ou cn un agent
$filtre = "objectclass=person" ;
$colonnes = array( "sn", "dn","groupmembership") ;
    $ldapsearch = ldap_search($ldapconn, $cn, $filtre, $colonnes ); 
    $info = ldap_get_entries($ldapconn, $ldapsearch); 
// print_r($REMOTE_ADDR) ; pour adresse ip
$droit_user = 1 ;
     	    for ($i=0;$i<$info[0]["groupmembership"]["count"];$i++)       	{ 
//$ldap_habilite	groupe habilite cf globals
if ( $info[0]["groupmembership"][$i] == $LDAP['habilite'] ) {
$droit_user = 2 ;
break ;
}
        } 
}  // fin else ok true
} // fin else password not null
   // on ferme la connexion au serveur LDAP 
   // ldap_disconnect($ldapconn);  // si tools_ldap est ok mais non !
ldap_close($ldapconn);
}  // fin if ldapconn

if ($ok) 	{
    session_start();
$_SESSION['member_id'] = $PHP_AUTH_USER ;
$_SESSION['droit_user'] = $droit_user; 
header("Location:$back");
} else 	{
$error_login = true;
// 
//		$admin = $ADMIN_CLINET ;
//		$subject = rawurlencode(sprintf("[CLINET] %s", $string_lang['SESSION_GET_NEW_ACCOUNT'][$lang]));
//		$body = rawurlencode(sprintf($string_lang['SESSION_GET_NEW_ACCOUNT_MSG'][$lang]));
//		$mailto = sprintf("mailto:%s?subject=%s&body=%s", $admin['email'], $subject, $body);
//		$ligne = sprintf("%s%s (%s).\n", $string_lang['SESSION_GET_NEW_ACCOUNT_HOW'][$lang], $mailto, ($admin['prénom'] . " " . $admin['nom']), $admin['login']);

 	   	header( "WWW-Authenticate: Basic realm="$titre""); 
    	header( "HTTP/1.0 401 Unauthorized");
echo "\n"
    .$string_lang['SESSION_INCORRECT_LOGIN'][$lang]
."\n"."
\n"
.$ligne."
\n" 
."Cliquez ici pour vous identifier de nouveau"
."

\n";
exit;
}
}

Messages postés
9
Date d'inscription
vendredi 1 juillet 2005
Statut
Membre
Dernière intervention
5 mars 2011

Bonjour à tous,

Le sujet date mais mon script pourra peut-être aider quelqu'un...


En plus, de vérifier l'authentification du l'utilisateur, je teste s'il fait parti d'un groupe LDAP autorisé :

<?php

// Paramètres LDAP

$dn = "dc=mondomaine, dc=fr" ;
$ldap_ous =array("ou= Administratreurs, ", "ou=Exploitants, " );
$ldap_domaine ="mondomaine.fr";
$ldaphost= "serveur-ldap" . $ldap_domaine ;
$ldapport = 389;

// Compte de connexion au Ldap

$ldap_admin= "compte_admin" ;
$ldap_pwd ="pwd_admin";

//Groupe des utilisateurs autorisés

$ldapgroup = "CN=Test PHP,OU=Groupes,DC=mondomaine,DC=fr" ;

// Connexion au Ldap

$ldapconn = ldap_connect( $ldaphost, $ldapport )
or die( "Impossible de se connecter au serveur LDAP {$ldaphost}" );
$ldapbind = ldap_bind ($ldapconn,$ldap_admin,$ldap_pwd)
or die( "Authentification au serveur LDAP {$ldaphost} échouée" );

// Boucle d'authentification

$auth =false;

// Test du contenu du formulaire de login : bien vérifier si le champ pass n'est pas vide

if
(isset($_POST['user']) && isset($_POST['pass']) && !empty($_POST['pass'])) {
foreach(
$ldap_ous as
$ou){
// Parcours de toute les OUs pour ...
$sr@ ldap_search (<gras>$ldapconn, $ou.$dn, "sAMAccountName</gras>" .$_POST['user']);
// Rechercher l'utilisateur

if(
$sr! = false ){

$info = @ldap_get_entries($ldapconn, $sr);
// Obtenir ses infos

if(
$info[ 'count' ] = = 1){
foreach (
$info[0][ 'memberof' ] as
$group){
// Parcourir ses groupes

if(
$group == $ldapgroup ){

// Si l'utilisateur fait parti du groupe autorisé, alors on tente une connexion Ldap avec son Compte

$auth =@ldap_bind($ldapconn,$_POST[ 'user' ]."@".$ldap_domaine,$_POST['pass']);
if(
$auth = = true ) break;

}
}
if
($auth == true )
// Si authentification OK : envoi vers la page Web

header( "location: site.html" );
}
}
}
if(
$auth ==false) header("location: auth_ldap.html");
// si authentification KO : retour au Login

}else {
echo
'Veuillez entrer un compte et mot de passe.';
}
?>
Messages postés
4
Date d'inscription
dimanche 11 avril 2010
Statut
Membre
Dernière intervention
3 juin 2013

Bonjour à tous

SVP quelqu'un pourrait me direc'est quoi la fonction pour filtrer les utilisateurs (uid) en leur indiquant que le code doit commence par A +6 numéros exemple ( A342344 )
2eme question mon code n'affiche rien pouvez vous me dire pourquoi !

Merci d'avance !