[HELP] ldap_bind prend le full name au lieu du logon name ?!

ldap_bind prend le full name au lieu du logon name ?! [HELP] - PHP - Programmation

Marsh Posté le 23-05-2008 à 16:23:33    

Bonjour à tous,

 

Tout est dans le titre.
Je fais une requête ldap_connect puis ldap_bind. Tout fonctionne quand le full name de l'utilisateur est le même que son login, mais s'il est différent ça ne fonctionne pas.
Par contre ça fonctionne si je rentre directement le full name + password.

 

Pour me faire comprendre : mon AD sous Win2K3S a un utilisateur "Michael Truc" dont le login est "mtruc".
Si j'entre "mtruc" + password, ça ne passe pas. Si j'entre "Michael Truc" + password, ça passe.

 

Mon code :

 
Code :
  1. $domain_login = "DOMAINE\\" . $login;
  2. $ldap['user'] = $domain_login;
  3. $ldap['pass'] = $passwd;
  4. $ldap['host'] = 'serveur.domaine.com';
  5. $ldap['port'] = 389;
  6. $ldap['dn'] = 'CN='.$ldap['user'].',OU=users,OU=blabla,OU=FRANCE,DC=domaine,DC=com';
  7. define("LDAP_INVALID_CREDENTIALS", 0x31 );
  8. // Désactiver les rapports d'anomalie, mais laisser les rapports d'erreur
  9. error_reporting(E_ERROR | E_PARSE | E_NOTICE);
  10. // Connexion au serveur ldap
  11. $ds = ldap_connect($ldap['host'], $ldap['port']) or die("Impossible de se connecter au serveur LDAP {".$ldap['host']."}" );
  12. ldap_set_option($ds, LDAP_OPT_PROTOCOL_VERSION, 3);
  13. ldap_set_option($ds, LDAP_OPT_REFERRALS, 0);
  14. // Identification par le ldap
  15. $ldap['bind'] = ldap_bind($ds, $ldap['dn'], $ldap['pass']);
  16. if(!$ldap['bind'])
  17. {
  18. if (ldap_errno($ds) == LDAP_INVALID_CREDENTIALS)
  19. {
  20. echo $ldap['user'].' est refusé';
  21. }
  22. else echo ldap_error($ds);
  23. exit;
  24. }
 

Une idée ? Ou c'est une limitation ?


Message édité par elliotdoe le 27-05-2008 à 17:02:14
Reply

Marsh Posté le 23-05-2008 à 16:23:33   

Reply

Marsh Posté le 26-05-2008 à 11:47:36    

essaye de préfixer avec le nom du domaine AD (genre "DOMAINE\mtruc" )
et essaye aussi avec la v3 du protocole ldap :

Code :
  1. ldap_set_option($ldap_connect, LDAP_OPT_PROTOCOL_VERSION, 3);

Reply

Marsh Posté le 26-05-2008 à 19:01:40    

Ok merci, je testerai demain :jap:

Reply

Marsh Posté le 27-05-2008 à 16:55:56    

Aucune des solutions ne fonctionne :/
 
J'ai préfixé avec "domaine\", avec "@domaine.com", ça ne change rien.
J'ai aussi mis en place la V3.
 
C'est étrange comme comportement. Se connecter par "Prénom Nom" c'est pas des plus intuitifs...

Reply

Marsh Posté le 27-05-2008 à 17:02:29    

PS : j'ai mis à jour mon code sur le premier message.

Reply

Marsh Posté le 27-05-2008 à 17:05:47    

bizarre, à mon taff ça marche sans soucis avec une AD sur 2003 serveur
- t'as quoi dans $ldap['dn'] ?
- tu as testé en dur avec par exemple un truc du genre : ldap_bind($ds, 'DOMAIN\mtruc', 'pass');

Reply

Marsh Posté le 27-05-2008 à 17:07:53    

ha ok, remplace la ligne 18 :

Code :
  1. $ldap['bind'] = ldap_bind($ds, $ldap['user'], $ldap['pass']);

Reply

Marsh Posté le 27-05-2008 à 17:25:47    

L'erreur est normale : pour identifier l'utilisateur, tu passes son DN complet et son mot de passe. En l'occurence (dans AD généralement), le DN d'un utilisateur est du genre "cn=Prenom Nom,<reste du DN>".
 
Quand tu entres le login 'Michael Truc', la variable $ldap['user'] (ligne 2) s'initialise avec 'Michael Truc' et la ligne 6 génère le DN "cn=Michael Truc,<reste du dn>" qui est un DN existant.
Lorsque tu passes en paramètre du script le login AD (mtruc) et non plus le nom prénom (qui correspond à la valeur du cn), tu te retrouves avec le DN suivant : "cn=mtruc,<reste du DN>", or ce DN ne doit pas exister dans AD, d'où l'erreur.
 
Une solution serait de rechercher le DN de l'utilisateur à partir de son login AD via un filtre ldap classique ; l'attribut AD contenant le login AD est 'sAMAccountName'. Une fois ce DN trouvé, tu refais le bind en l'utilisant ; si le filtre échoue, c'est que l'utilisateur a entré un mauvaus login.


Message édité par electricblue le 27-05-2008 à 17:27:57
Reply

Marsh Posté le 27-05-2008 à 17:28:12    

Ok, le bind marche maintenant, merci ! A force de regarder son code on ne voit plus les erreurs de ce genre...

 

Par contre j'ai un nouveau problème :
J'ai un ldap_search juste après, qui ne trouve plus ce que je lui demande:

 
Code :
  1. if ($ds) {
  2. $attributes = array("cn", "sn", "givenname", "mail" );
  3. $filter="(|(sn=*)(givenname=*))";
  4. $sr = ldap_search($ds, "CN=" . $login . ",OU=users,OU=blabla,OU=FRANCE,DC=domaine,DC=com", $filter, $attributes);
  5. $entries = ldap_get_entries($ds, $sr);
  6. foreach ($entries[0]['cn'] as $key => $cn);
  7. foreach ($entries[0]['sn'] as $key => $sn);
  8. foreach ($entries[0]['givenname'] as $key => $givenname);
  9. foreach ($entries[0]['mail'] as $key => $mail);
  10. ###SESSION STARTS###
  11. session_start();
  12. //On enregistre les variables de session
  13. $_SESSION['login'] = $cn;
  14. $_SESSION['nom'] = $sn;
  15. $_SESSION['prenom'] = $givenname;
  16. }
 

Une idée ? C'est lié mais je vois pas en quoi, puisqu'il devrait chercher sur les bons users.

 

C'est étonnant, quand j'utilise un utilisateur qui a son full name identique à son login, ça fonctionne sans erreurs. Dans l'autre cas, j'ai :

 
Citation :


Notice: Undefined variable: cn in c:\program files\easyphp1-8\www\tr\php\auth-ldap.php on line 66

 

Notice: Undefined variable: sn in c:\program files\easyphp1-8\www\tr\php\auth-ldap.php on line 67

 

Notice: Undefined variable: givenname in c:\program files\easyphp1-8\www\tr\php\auth-ldap.php on line 68

  

PS : electric, merci pour le conseil. Je vais chercher sur cette piste.


Message édité par elliotdoe le 27-05-2008 à 17:31:26
Reply

Marsh Posté le 27-05-2008 à 17:39:38    

Toujours le même problème : tu génères un DN inexistant ligne 4.
 
Voici l'algo que je vois :
1- connexion en tant que manager à l'annuaire
2- recherche de l'entrée avec le filtre suivant : (|(cn=$login)(samaccountname=$login))
3- un seul résultat doit être retourné par la requête ci dessus, sinon erreur
4- un fois l'entrée trouvée, tu prends son DN
5- tu refais un bind en utilisant ce DN et le mot de passe de l'utilisateur

Reply

Marsh Posté le 27-05-2008 à 17:39:38   

Reply

Marsh Posté le 27-05-2008 à 19:03:59    

Ok nickel. Je teste demain et je te dis.

Reply

Marsh Posté le 28-05-2008 à 09:09:26    

electricblue a écrit :

1- connexion en tant que manager à l'annuaire
2- recherche de l'entrée avec le filtre suivant : (|(cn=$login)(samaccountname=$login))
3- un seul résultat doit être retourné par la requête ci dessus, sinon erreur
4- un fois l'entrée trouvée, tu prends son DN
5- tu refais un bind en utilisant ce DN et le mot de passe de l'utilisateur


ou plus simple :
- bind direct avec le login de l'utilisateur
- recherche avec "sAMAccountName=$login"

Reply

Marsh Posté le 28-05-2008 à 13:30:58    

soju a écrit :


ou plus simple :
- bind direct avec le login de l'utilisateur
- recherche avec "sAMAccountName=$login"


Comment il peut binder s'il ne connait justement pas l'entrée de l'utilisateur?

Reply

Marsh Posté le 28-05-2008 à 13:53:07    

electricblue a écrit :

Comment il peut binder s'il ne connait justement pas l'entrée de l'utilisateur?

comme j'ai dit plus haut
ça marche très bien sur mes applis

Reply

Marsh Posté le 28-05-2008 à 16:12:36    

Tu pourrais être plus précis svp?
Qu'est-ce que tu entends par login de l'utilisateur (DN, RDN, juste la valeur)?
Tes applis ont-elles un mécanisme d'authentification inclus ou est-ce toi qui l'as développé?


Message édité par electricblue le 28-05-2008 à 16:13:29
Reply

Marsh Posté le 28-05-2008 à 16:28:43    

juste DOMAINE\login
et authentification maison
 
Je ne suis pas un spécialiste de ldap ni ad, mais je trouvais bizarre de devoir s'authentifier sur l'annuaire avec un compte générique juste pour authentifier un utilisateur.
 

Reply

Marsh Posté le 28-05-2008 à 18:09:41    

Ca m'intéresse bien de savoir comment tu fais soju :jap:

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed