Précédent   Forum des professionnels en informatique > PHP > Bibliothèques et frameworks
Bibliothèques et frameworks Forum d'entraide sur les frameworks, templates, bibliothèques de code (PDFLib, eZPdf, JpGraph, Artichow, PEAR, etc). Avant de poster : FAQ bibliothèques, toutes les FAQ PHP et cours bibliothèques
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 15/06/2007, 14h25   #1
Nouveau Membre du Club
 
Inscription : mai 2007
Messages : 157
Détails du profil
Informations forums :
Inscription : mai 2007
Messages : 157
Points : 37
Points : 37
Par défaut [LDAP] Authentification basée sur active directory

Salut
je travaille sur un projet d'intranet et j'aimerais que l'authentification se base sur l'active directory mais le problème c'est que je suis perdu entre les fonctions ldap. Voici mon code :
Code :
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
 
<?php
if(isset($_POST['go']) && $_POST['go'] == 'Validez')
{
	if(!empty($_POST['login']) && !empty($_POST['pwd']))
	{
	$ldapdn = mysql_real_escape_string(strtolower($_POST['login'])) . '@domain_name';
	$ldappwd = mysql_real_escape_string(strtolower($_POST['pwd']));
 
	// Connexion au serveur
	$cnx = ldap_connect('adress_ip', 389);
	ldap_set_option($cnx, LDAP_OPT_PROTOCOL_VERSION, 3);
	// la racine de base
	$racine = 'OU=Personnel,DC=mon service,DC=ma compagnie';
 
		if($cnx)
		{
			if(ldap_bind($cnx, $ldapdn, $ldappwd))
			{
			$_SESSION['login'] = $ldapdn;
			sleep(1);
			header('location: http://adresse_ip/helpdesk/index.php?page=cpublic');
			exit;
			}
			else
			{
			echo 'Login invalide !';
			header('location: http://adresse_ip/helpdesk/index.php?page=cnx');
			exit;
			}
		}
	// Déconnexion
	ldap_close($cnx);
	}
	echo 'Merci de remplir les champs obligatoires';
}
 
?>
il suffit d'utiliser la fonction ldap_bind ou ajouter un autre controle.
merci de votre aide
Qamalito est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 15/06/2007, 15h33   #2
Membre éclairé
 
Avatar de BornBanane
 
Homme
Ingénieur développement logiciels
Inscription : mars 2007
Messages : 274
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France, Hauts de Seine (Île de France)

Informations professionnelles :
Activité : Ingénieur développement logiciels

Informations forums :
Inscription : mars 2007
Messages : 274
Points : 350
Points : 350
Je pense que tu as déjà un soucis au niveau de ton
Code :
ldap_bind($cnx, $ldapdn, $ldappwd)
ldap_bind prend en 2eme argument un DN ( ex :CN=Nom Prenom ,OU=Personnel,DC=mon service,DC=ma compagnie )

Pour de l'authentification LDAP j'utilise une méthode particulière en 5 étapes :

1ère étape : Formulaire avec demande du Login Windows et Mot de passe Windows
2ème étape : Connexion à l'AD avec un utilisateur spécifique et fixe ( un utilisateur fantome n'existant que pour ca et ayant juste des droit en lecture dans mon exemple l'utilisateur TEST)
3ème étape : Recherche dans l'AD du DN correspondant au Login Windows
4ème étape : Essaie de connection a l'AD avec le DN trouvé et le Mot de passe Windows
5ème étape : déconnexion

Et voila en gros ce que cela donne :

Code :
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
 
 
	// Parametre de connexion de l'utilisateur TEST
 
	$server = "192.168.0.1";
	$port = "389";
	$racine = "OU=Utilisateurs,DC=google,DC=com"; // 
	$rootdn = "CN=Test Test,OU=Utilisateurs,DC=google,DC=com";
	$rootpw = "google";
 
	// Parametre de la personne se loguant
 
	 $rootdn_util = ""; // distinguishedName ou DN
	 $rootpw_util = $pass; // le Mot de passe Windows du formulaire
 
	 // Connexion à l'AD
	$ds = ldap_connect($server,$port);
	if ($ds)
	{
                // Bind à l'AD avec l'utilisateur TEST
		$db = ldap_bind($ds,$rootdn,$rootpw);
		if ( $db )
		{
                        // Recherche à partir du login le DN
			$sr = ldap_search($ds,$racine,'(&(objectclass=person)(sAMAccountName='.$login.'))');
			$info = ldap_get_entries($ds,$sr);
			if ( $info['count'] > 0)
			{
				//echo 'Utilisateur trouvé<br/>';		
				$rootdn_util = $info[0]['distinguishedname'][0];
 
 
				// On rebind sur ce nouvel utilisateur
				if ( ldap_bind($ds,$rootdn_util,$rootpw_util))
				{
					//l'utilisateur se trouve bien dans l'AD
 
				}
				else echo 'Mauvais Mot de passe';
 
 
			}
			else echo 'Utilisateur non trouvé';
			ldap_unbind($ds);
 
		}
		else echo 'ldap_search failed retour : '.$db;
	}
	else echo 'ldap_connect failed retour :'.$ds;

Niveau fonction :

ldap_connect : engage une connexion avec le server ldap
ldap_bind : se connecte au server ldap avec un identifiant mot de passe
ldap_search : fait une recherche sur le server ldap
ldap_fet_entry : récupère dans un array les résultats d'une recherche
ldap_unbind : se déconnecte

J'espère que ca t'aidera, il faut s'y connaitre un peu en LDAP et adresse LDAP pour manier ceci.
BornBanane est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 15/06/2007, 16h35   #3
Nouveau Membre du Club
 
Inscription : mai 2007
Messages : 157
Détails du profil
Informations forums :
Inscription : mai 2007
Messages : 157
Points : 37
Points : 37
merci francoisIT c'est très gentil de ta part
pour la 2ème étape, si je comprends bien, il doit se connecter en tant que admin pour checker si un user existe ou pas.
merci de votre aide.
Qamalito est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 18/06/2007, 10h51   #4
Membre éclairé
 
Avatar de BornBanane
 
Homme
Ingénieur développement logiciels
Inscription : mars 2007
Messages : 274
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France, Hauts de Seine (Île de France)

Informations professionnelles :
Activité : Ingénieur développement logiciels

Informations forums :
Inscription : mars 2007
Messages : 274
Points : 350
Points : 350
Non pas forcement en admin, mais il suffit d'un utilisateur quelconque ( Il doit pouvoir se connecter a l'AD via LDAP et avoir un acces en lecture a l'annuaire, ce qui est le cas de la plupart des comptes ) .
BornBanane est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 20/06/2007, 00h28   #5
Nouveau Membre du Club
 
Inscription : mai 2007
Messages : 157
Détails du profil
Informations forums :
Inscription : mai 2007
Messages : 157
Points : 37
Points : 37
Citation:
Envoyé par francoisIT
Non pas forcement en admin, mais il suffit d'un utilisateur quelconque ( Il doit pouvoir se connecter a l'AD via LDAP et avoir un acces en lecture a l'annuaire, ce qui est le cas de la plupart des comptes ) .
merci beaucouq ca marche mais le problème c'est que j'arrive pas à recuperer les attributs de la personne qui se connecte et pour info, j'ai essayé d'utliser le resultat de la fonction ldap_get_entries mais toujours le meme problème.
voici le code :
Code :
1
2
3
4
5
 
// $sr est le resultat de la recherche
$info = ldap_get_entriess($cnx, $sr);
if ( $info['count'] > 0)
echo $indo[0]['displyName'][0]; // s'affiche rien
merci de votre aide
Qamalito est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 20/06/2007, 10h49   #6
Membre éclairé
 
Avatar de BornBanane
 
Homme
Ingénieur développement logiciels
Inscription : mars 2007
Messages : 274
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France, Hauts de Seine (Île de France)

Informations professionnelles :
Activité : Ingénieur développement logiciels

Informations forums :
Inscription : mars 2007
Messages : 274
Points : 350
Points : 350
Pour les attributs, le mieux à faire c'est :

Tu va voir tout ce qu'il te génère et comment récupérer l'information que tu veux. Attention c'est un peu le bordel .

Et attention tu as mis $indo au lieu de $info sur ton poste.

Sur mon AD l'attribut displayName se récupère comme ceci :

Code :
1
2
 
$info[0]['displayname'][0]  // en miniscule !
BornBanane est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 20/06/2007, 16h29   #7
Nouveau Membre du Club
 
Inscription : mai 2007
Messages : 157
Détails du profil
Informations forums :
Inscription : mai 2007
Messages : 157
Points : 37
Points : 37
Citation:
Envoyé par francoisIT
Pour les attributs, le mieux à faire c'est :

Tu va voir tout ce qu'il te génère et comment récupérer l'information que tu veux. Attention c'est un peu le bordel .

Et attention tu as mis $indo au lieu de $info sur ton poste.

Sur mon AD l'attribut displayName se récupère comme ceci :

Code :
1
2
 
$info[0]['displayname'][0]  // en miniscule !
merci beaucoup ca marche en fait, je suis basé sur les attributs récupérés via ldap browser c'est pourquoi ca marche pas.
Qamalito est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 20/06/2007, 16h46   #8
Membre éclairé
 
Avatar de BornBanane
 
Homme
Ingénieur développement logiciels
Inscription : mars 2007
Messages : 274
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France, Hauts de Seine (Île de France)

Informations professionnelles :
Activité : Ingénieur développement logiciels

Informations forums :
Inscription : mars 2007
Messages : 274
Points : 350
Points : 350
Ca fait toujours plaisir d'aider quelqun
BornBanane est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 20/06/2007, 18h45   #9
Nouveau Membre du Club
 
Inscription : mai 2007
Messages : 157
Détails du profil
Informations forums :
Inscription : mai 2007
Messages : 157
Points : 37
Points : 37
Citation:
Envoyé par francoisIT
Ca fait toujours plaisir d'aider quelqun
non pas encore juste un petit problème c'est que j'aimerais faire une condition basée sur les groupes que nous avons c'est à dire si un user appartient à ce groupe affiche cet interface sinon affiche celle la.
bon le problème c'est que j'ai pas bien saisi la structure du tableau renvoyé par la fonction ldap_get_entries.
merci de votre aide
Qamalito est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 01/07/2007, 00h43   #10
Nouveau Membre du Club
 
Inscription : mai 2007
Messages : 157
Détails du profil
Informations forums :
Inscription : mai 2007
Messages : 157
Points : 37
Points : 37
Citation:
Envoyé par Qamalito
non pas encore juste un petit problème c'est que j'aimerais faire une condition basée sur les groupes que nous avons c'est à dire si un user appartient à ce groupe affiche cet interface sinon affiche celle la.
bon le problème c'est que j'ai pas bien saisi la structure du tableau renvoyé par la fonction ldap_get_entries.
merci de votre aide
resalut ldapien
une petite aide svp parce que c'est très important pour moi.
et puis, j'ai defini un array et je teste si un user existe dans ce tableau, affiche cette interface sinon affiche celle la mais je trouve cette sulution n'est pas pratique parc que si un user est ajouté, je dois modifier le code de nouveau.
merci de votre aide.
Qamalito est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 12h06.


 
 
 
 
Partenaires

Hébergement Web