PHP : SSO - Active Directory (juin 2012)

J'ai eu faire quelques recherches pour monter un SSO en PHP couplé à AD (ACtive Directory).

Après quelques recherches, j'ai trouvé le moyen, et il est simplissime. Je le partage avec vous car ca peut se révéler utile.

Coté serveur (système)

Installation des dépendances :

apt-get install libapache2-mod-perl2 perl build-essential
apt-get install libapache2-authenntlm-perl

Modification de la conf apache (modifiez les paramètres DOMAIN, DC1, DC2, SITE avant de copier-coller comme un bourrin !) :

cat >> /etc/apache2/sites-enabled/000-default <<TXT

PerlModule Apache2::AuthenNTLM
<Directory "/var/www/SITE">
    PerlAuthenHandler Apache2::AuthenNTLM
    AuthType ntlm,basic
    AuthName paipartners
    require valid-user
    PerlAddVar ntdomain "DOMAIN DC1 DC2"
    PerlSetVar defaultdomain DOMAIN
    PerlSetVar splitdomainprefix 1
</Directory>
TXT

Vous trouverez de la doc sur la config de ce module Perl sur ce lien.

Config hosts

vi /etc/hosts
# Ajouter 
192.168.10.99   domain.ext DOMAIN DC1 DC2

Config resolv.conf

vi /etc/resolv.conf
# Ajouter 
search domain.ext
nameserver IP_DC1
nameserver IP_DC2

Et enfin un petit restart d'apache

/etc/init.d/apache2 restart

Coté serveur (php)

Vous pouvez récupérer le login de la personne via la clé REMOTE_USER de la variable $_SERVER :

<?php
echo "Hello " . $_SERVER['REMOTE_USER'] . " !";

Si vous devez par la suite checker des droits applicatifs renseignés dans AD, il vous suffit d'interroger AD via l'extension ldap de PHP.

Coté client

Il faut rajouter dans la base de registre (regedit.exe) la clé DWORD suivante HKEY_LOCAL_MACHINE/SYSTEM/CurrentControlSet/Control/Lsa/LmCompatibilityLevel avec la valeur 1.

Allez faire un tour sur ce lien de Ms Technet pour comprendre à quoi sert cette clé.

Enfin il ne reste plus qu'à ajouter l'url de votre site dans les sites trustés pour chaque browser utilisé. Pour Firefox, allez dans about:config et mettez votre url dans la valeur network.automatic-ntlm-auth.trusted-uris.