PHP – Authentification avec Active Directory
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 :
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
Fabien
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
admin
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
Fabien
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)
admin
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…
Fabien
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 !
admin
Merci pour ce retour. Content d’avoir pu vous aider. 🙂