Précédent   Forum des professionnels en informatique > PHP > Langage > Fonctions
Fonctions Forum d'entraide sur les fonctions PHP. Avant de poster -> FAQ fonctions et Sources diverses
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 11/01/2011, 16h59   #1
PBR
Invité régulier
 
Inscription : novembre 2005
Messages : 18
Détails du profil
Informations forums :
Inscription : novembre 2005
Messages : 18
Points : 9
Points : 9
Par défaut ldap_bind et AD : cas particulier

Bonjour à tous,

Voilà donc mon souci...

Le but est de permettre à un utilisateur de s'authentifier depuis un extranet avec son compte Active Directory via un formulaire html classique.

Je vous rassure tout de suite, j'ai déjà installé et configuré les composants nécessaires (la connexion vers AD se fait bien et avec SSL)
Le formulaire récupère donc un login et un mot de passe, que l'on passe à la fonction ldap_bind().
Jusqu'ici, tout fonctionne, à partir du moment où on fournit le bon couple login/password l'authentification se fait correctement (d'ailleurs étant connecté en ldaps, la modification de mot de passe fonctionne aussi).

Le problème concerne uniquement les comptes AD qui ont l'option "L'utilisateur doit changer le mot de passe a la prochaine connexion" activée.
Pour ce type de compte, ldap_bind() retourne systématiquement false, même si on fournit des identifiants valides .

Ce que je souhaiterais dans ce cas, c'est que l'utilisateur puisse se connecter, et qu'il soit redirigé vers un formulaire l'invitant à choisir un nouveau mot de passe...

Pour cela, je pensais utiliser ldap_search() sur son dn, en testant l'attribut pwdlastset pour savoir si l'utilisateur doit changer de mot de passe (il vaut 0 dans ce cas).

Mais étant donné que ldap_bind() renvoie toujours false pour ce type de compte, comment puis-je contrôler que l'utilisateur a saisi un mot de passe valide ?

D'après les recherches que j'ai pu faire, il semblerait que l'on ne puisse pas utiliser ldap_search() ou ldap_compare() sur le mot de passe (même crypté)...

Comment vérifier la validité du mot de passe saisi sans utiliser ldap_bind() ?

Avez-vous déjà rencontré cette problématique ?


Merci d'avance pour votre aide.
PBR est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 12/01/2011, 14h02   #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
Le plus simple je pense est d'utiliser un compte générique LDAP (un compte qui puisse faire de la recherche et dont le mot de passe n'expire pas). Et donc, c'est avec ce compte qu'il faut vérifier si l'utilisateur existe avec son login et de voir si son mot de passe est encore valide.
__________________
Smiley de Plomb 2009
Anciennement FrancoisIT
BornBanane est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 12/01/2011, 17h17   #3
PBR
Invité régulier
 
Inscription : novembre 2005
Messages : 18
Détails du profil
Informations forums :
Inscription : novembre 2005
Messages : 18
Points : 9
Points : 9
Merci pour ta réponse BornBanane,

En fait je me suis mal exprimé mais c'est précisemment ce que je cherche à faire

Citation:
Envoyé par BornBanane Voir le message
vérifier si l'utilisateur existe avec son login et de voir si son mot de passe est encore valide.
Effectivement en utilisant un compte générique, comme je le suggérais dans mon message précédent, je peux regarder pour un utilisateur donné si son mot de passe est valide (avec pwdlastset).

Mais pour cela il faut que je sois sûr que la personne qui tente de s'authentifier est bien la bonne (même si son mdp est expiré).

Le problème c'est qu'apparemment ce n'est pas possible de faire de recherche sur le mot de passe... AD bloque au niveau sécurité et le champ n'est accessible qu'en écriture.

Evidemment ça semble logique que l'on ne puisse pas lire la valeur du mot de passe (même crypté, quoi que...), mais j'espérais pouvoir utiliser par exemple la fonction ldap_compare pour comparer le mdp dans AD et celui saisi par l'utilisateur.

PBR est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 14/01/2011, 11h55   #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
En faite il faut chercher dans le ldap (via compte générique), avec le login, si une entrée existe bien.
Vérifié le champ pwdlastset de cet utilisateur.
Si celui-ci est correct . Tu te déconnecte du ldap.
Tu tente de te connecter au ldap avec l'utilisateur en cours, si la connexion fonctionne alors le mot de passe est correct. Sinon le mot de passe n'est pas correct.

Par contre si le mot de passe est expiré je ne sais pas comment prcédé, je n'ai jamais eu ce cas à faire.
__________________
Smiley de Plomb 2009
Anciennement FrancoisIT
BornBanane est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 17/01/2011, 08h59   #5
PBR
Invité régulier
 
Inscription : novembre 2005
Messages : 18
Détails du profil
Informations forums :
Inscription : novembre 2005
Messages : 18
Points : 9
Points : 9
Bonjour et merci de ton aide BornBanane,

Je suis d'accord avec toi sur la démarche, c'est précisemment ce que je cherche à réaliser.

Citation:
Envoyé par BornBanane Voir le message
Tu tente de te connecter au ldap avec l'utilisateur en cours, si la connexion fonctionne alors le mot de passe est correct. Sinon le mot de passe n'est pas correct.
Le problème c'est que justement, si le mot de passe est expiré ou que pwdlastset est à zéro (l'utilisateur doit changer son mot de passe, en fait ça revient au même), le bind ne fonctionne pas, même si les identifiants fournis sont corrects.


Citation:
Envoyé par BornBanane Voir le message
Par contre si le mot de passe est expiré je ne sais pas comment prcédé, je n'ai jamais eu ce cas à faire.
C'est bien là mon problème, qui justifie ce post

Après plusieurs recherches et tentatives, il semblerait que ce soit malheureusement impossible... je vais devoir faire autrement.

Merci en tout cas pour ton aide BornBanane
PBR 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 19h41.


 
 
 
 
Partenaires

Hébergement Web