Alors vous avez développé une belle application en PHP, et vous souhaitez que les utilisateurs s’authentifient avec l’annuaire Microsoft Active Directory de votre entreprise ?

Voici un rapide mode d’emploi. L’exemple est pour un système Linux Debian 10. Vous aurez besoin d’installer quelques paquets:

$ sudo apt install php-ldap
$ sudo phpenmod ldap
$ sudo service apache2 restart

Cette version condensée utilise 4 variables : $ldap_server, $domain, $user_pseudo, et $user_password.

  • $ldap_server est le nom ou l’adresse IP du contrôleur de domaine Microsoft Active Directory sur votre réseau
  • $domain est le nom de votre domaine Active Directory
  • $user_pseudo et $user_password sont le login et le mot de passe de l’utilisateur qui veut se connecter.

Voici à quoi peut ressembler votre script d’authentification, que vous pouvez appeler par exemple « auth.php« :


<?php
$ldap_server='monserveurad.maboite.com';
$domain='mondomainead';
// ----------------- AUTHENTIFICATION LDAP ------------------------
if ( isset($_POST['user_password']) ) {
       $user_pseudo=$_POST['user_pseudo'];
       $user_password=$_POST['user_password'];
        // --- Connexion au serveur AD
        $ad = ldap_connect($ldap_server);
        // Définissons quelques variables...
        ldap_set_option($ad, LDAP_OPT_PROTOCOL_VERSION, 3);
        ldap_set_option($ad, LDAP_OPT_REFERRALS, 0);
        // echo "Serveur AD : $ldap_server Domaine : $domain Pseudo : $user_pseudo Mot de passe : $user_password <br>";
       // On tente l'authentification 
       @$bd = ldap_bind($ad,"$user_pseudo@$domain","$user_password");
       if ( $bd) { // Si authentification ok, redirection vers le menu principal de l'appli
             echo "Bienvenue $user_pseudo";
             session_start();
             $_SESSION["login"] = true;
             $_SESSION["user_pseudo"] = $user_pseudo;
             echo "<meta http-equiv=refresh content=1;url=menu.php />";
       }
       else { echo "<p>Authentification échouée</p>" ; exit; }
        ldap_close($ad);
} else {
    echo "<form method=post>";
    echo "Votre identifiant <input type=text name=user_pseudo value=$user_pseudo >";
    echo "Votre mot de passe <input type=password name=user_password value=$user_password >";
    echo '<input type=submit>';
}
// ---------------- Fin authentification LDAP ----------------------
?>

Et dans le script « menu.php » :


<?php
session_start();
if ( $_SESSION["login"] != true ) { // Si pas de session, on renvoie à la page d'authentification
echo "<meta http-equiv=refresh content=1;url=auth.php />";
exit;
}
// Si la session existe, on affiche la page
$user_pseudo= $_SESSION["user_pseudo"];
echo "Vous êtes connecté en tant que : $user_pseudo";
?>


Tests en ligne de commande sous Linux DEBIAN


Pour vérifier si le compte existe bien dans l’Active Directory de votre domaine Microsoft, et s’il est bien actif vous pouvez utilisez la commande ldapsearch sur votre système Linux :
Exemples :

Recherche à partir du login « jrullier »:



$ ldapsearch -h 10.77.5.1   -D "jrullier@maboite" -LLL "(sAMAccountName=jrullier)" -W -b "DC=maboite,DC=corp" uid cn sn telephoneNumber AccountExpires userAccountControl
Enter LDAP Password:
dn: CN=Rullier\, Jean-Francois,OU=Temps and Contractors,OU=France-SSI,OU=Europ
e,DC=maboite,DC=corp
cn: Rullier, Jean-Francois
sn: RULLIER
telephoneNumber: +33768839144
userAccountControl: 512
accountExpires: 133709328000000000

# refldap://ForestDnsZones.maboite.corp/DC=ForestDnsZones,DC=maboite,DC=corp

# refldap://DomainDnsZones.maboite.corp/DC=DomainDnsZones,DC=maboite,DC=corp

# refldap://maboite.corp/CN=Configuration,DC=maboite,DC=corp

$

Ici la valeur 512 pour userAccountControl indique que le compte « jrullier » est actif,
et que sa date d’expiration de accountExpires est le 16 décembre 2024.

Autre exemple :


$ ldapsearch -h 10.77.5.1   -D "jrullier@maboite" -LLL "(sAMAccountName=lucien)" -W -b "DC=maboite,DC=corp" uid cn sn telephoneNumber AccountExpires userAccountControl
Enter LDAP Password:
dn: CN=Coreteam advanced\, tw,OU=Quarantine,OU=France-SSI,OU=Europe,DC=maboite,DC=corp
cn: Coreteam advanced, tw
sn: Coreteam advanced
userAccountControl: 66050
accountExpires: 9223372036854775807

# refldap://ForestDnsZones.maboite.corp/DC=ForestDnsZones,DC=maboite,DC=corp

# refldap://DomainDnsZones.maboite.corp/DC=DomainDnsZones,DC=maboite,DC=corp

# refldap://maboite.corp/CN=Configuration,DC=maboite,DC=corp

$

La valeur 66050 pour userAccountControl indique que le compte « lucien » est désactivé. (voir explication dans les liens utiles plus bas)

Recherche à partir du nom de famille « Soni »:


jrullier@euaixprdogr:~$ ldapsearch -h 10.77.5.1 -D "jrullier@maboite" -LLL "(sn=Soni)" -W -b "DC=maboite,DC=corp" uid cn sn telephoneNumber AccountExpires userAccountControl sAMAccountName
Enter LDAP Password:
dn: CN=Soni\, Marcel,OU=Users,OU=France-SSI,OU=Europe,DC=maboite,DC=corp
cn: Soni, Marcel
sn: Soni
userAccountControl: 512
accountExpires: 9223372036854775807
sAMAccountName: BS0624

Vérifier si un mot de passe est expiré

Exemple on vérifie le compte dont le login AD est « MJ0724 ». Syntaxe :

ldapsearch -x -h 10.77.5.1 -LLL -b "DC=supersonic,DC=corp" -D "jrullier@supersonic" "(sAMAccountName=MJ0724)" -W cn msDS-User-Account-Control-Computed

Le code de retour 8388608 indique un mot de passe Microsoft AD expiré.

Test avec un compte login « jrullier » dont le mot de passe n’est pas expiré expiré:

Voir la liste des codes de retour par exemple ici :

https://github.com/MicrosoftDocs/SupportArticles-docs/blob/main/support/windows-server/active-directory/useraccountcontrol-manipulate-account-properties.md

Autres liens utiles

Conversion des timestamps en dates :

https://www.epochconverter.com/ldap

Calcul des valeurs de userAccountControl :

https://www.it-connect.fr/active-directory-et-lattribut-useraccountcontrol/?utm_content=cmp-true

Liste des attributs des comptes utilisateurs :

http://www.selfadsi.org/user-attributes.htm


Pensez aux autres, laissez vos commentaires ci-dessous…

  1. Merci pour ce bout de code , j’ai testé et c’est exactement ce que je cherché.

    Maintenant , comment empêcher les utilisateurs d’accéder directement à la page menu.php sans s’être authentifié avec la page auth.php ?
    Et ensuite , comment récupérer la variable de l ‘identifiant ($user_pseudo) dans la page menu.php ?

    Merci d’avance

    Fabien

    • Bonjour Fabien,
      Pour empêcher les utilisateurs d’accéder directement à la page menu.php, il faut créer une session PHP.
      J’ai complété le code d’exemple. En gros :

      Dans auth.php, ajouter les 3 lignes :
      session_start();
      $_SESSION[‘login’] = true;
      $_SESSION[‘user_pseudo’] = $user_pseudo;

      Et dans menu.php, voir l’exemple ci-dessus.

      JFR

  2. Merci pour la réponse très rapide 🙂
    Je viens de tester mais ça tourne en boucle :
    après une authentification réussite j’arrive bien sur la page du nenu.php et je suis tout de suite redirigé sur la page auth.php
    J’ai l’impression que la session n’est pas reprise quand j’arrive sur la page menu.php ( je suis novice sur ce sujet)

    • Bonsoir Fabien,
      C’est peut-être lié aux doubles quotes, qui étaient transformées par WordPress en « dans le code donné en exemple.
      Je l’ai corrigé dans l’article. Vérifiez ce point.
      Et si vous voulez envoyez-moi votre code par Email à jf.rullier@activpart.com pour que je le checke…

  3. Super Merci 🙂
    Il y avait bien un pb avec les double quote.

    Mais il y en avait un autre :
    j’ai du ouvrir la session au tout début de ma page auth.php comme ci-dessous :

    …..

    Maintenant tout fonctionne , encore MERCI !

Leave a Reply

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *

Blue Captcha Image
Refresh

*

Ce site utilise Akismet pour réduire les indésirables. En savoir plus sur comment les données de vos commentaires sont utilisées.