IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Langage PHP Discussion :

ldap_bind et AD : cas particulier


Sujet :

Langage PHP

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    PBR
    PBR est déconnecté
    Membre averti
    Inscrit en
    Novembre 2005
    Messages
    18
    Détails du profil
    Informations forums :
    Inscription : Novembre 2005
    Messages : 18
    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.

  2. #2
    Membre chevronné Avatar de BornBanane
    Homme Profil pro
    dev
    Inscrit en
    Mars 2007
    Messages
    284
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : dev

    Informations forums :
    Inscription : Mars 2007
    Messages : 284
    Par défaut
    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.

  3. #3
    PBR
    PBR est déconnecté
    Membre averti
    Inscrit en
    Novembre 2005
    Messages
    18
    Détails du profil
    Informations forums :
    Inscription : Novembre 2005
    Messages : 18
    Par défaut
    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.


  4. #4
    Membre chevronné Avatar de BornBanane
    Homme Profil pro
    dev
    Inscrit en
    Mars 2007
    Messages
    284
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : dev

    Informations forums :
    Inscription : Mars 2007
    Messages : 284
    Par défaut
    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.

  5. #5
    PBR
    PBR est déconnecté
    Membre averti
    Inscrit en
    Novembre 2005
    Messages
    18
    Détails du profil
    Informations forums :
    Inscription : Novembre 2005
    Messages : 18
    Par défaut
    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

Discussions similaires

  1. Effacer (cas particulier) d'un champ de formulaire
    Par frog43 dans le forum Général JavaScript
    Réponses: 12
    Dernier message: 17/05/2006, 18h29
  2. Réponses: 27
    Dernier message: 12/01/2006, 11h04
  3. cas particulier agaçant
    Par devdébuto dans le forum C
    Réponses: 17
    Dernier message: 13/12/2005, 23h45
  4. Enregistrement courant après refresh [cas particulier]
    Par say dans le forum Bases de données
    Réponses: 8
    Dernier message: 02/08/2005, 15h59

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo