web-dev-qa-db-fra.com

Authentification dans PHP en utilisant LDAP via Active Directory

Je cherche un moyen d'authentifier les utilisateurs via LDAP avec PHP (avec Active Directory en tant que fournisseur). Idéalement, il devrait pouvoir s'exécuter sur IIS = 7 ( adLDAP le fait sur Apache). Quiconque avait fait quelque chose de similaire, avec succès?

  • Edit: Je préférerais une bibliothèque/classe avec du code prêt à partir ... Il serait stupide d'inventer la roue quand quelqu'un l'a déjà fait.
101
DV.

Importer une bibliothèque entière semble inefficace alors qu'il ne vous faut que deux lignes de code ...

$ldap = ldap_connect("ldap.example.com");
if ($bind = ldap_bind($ldap, $_POST['username'], $_POST['password'])) {
  // log them in!
} else {
  // error message
}
162
ceejayoz

On pourrait penser que la simple authentification d'un utilisateur dans Active Directory serait un processus assez simple utilisant LDAP dans PHP sans avoir besoin d'une bibliothèque. Cependant, beaucoup de choses peuvent le compliquer assez rapidement :

  • Vous devez valider la saisie. Un nom d'utilisateur/mot de passe vide passerait sinon.
  • Vous devez vous assurer que le nom d'utilisateur/mot de passe est correctement codé lors de la liaison.
  • Vous devriez chiffrer la connexion à l'aide de TLS.
  • Utilisation de serveurs LDAP distincts pour la redondance en cas de panne.
  • Obtention d'un message d'erreur informatif en cas d'échec de l'authentification.

Il est en fait plus facile dans la plupart des cas d’utiliser une bibliothèque LDAP prenant en charge ce qui précède. J'ai finalement fini par lancer ma propre bibliothèque qui gère tous les points ci-dessus: LdapTools (Enfin, pas seulement pour l'authentification, cela peut faire beaucoup plus). Il peut être utilisé comme suit:

use LdapTools\Configuration;
use LdapTools\DomainConfiguration;
use LdapTools\LdapManager;

$domain = (new DomainConfiguration('example.com'))
    ->setUsername('username') # A separate AD service account used by your app
    ->setPassword('password')
    ->setServers(['dc1', 'dc2', 'dc3'])
    ->setUseTls(true);
$config = new Configuration($domain);
$ldap = new LdapManager($config);

if (!$ldap->authenticate($username, $password, $message)) {
    echo "Error: $message";
} else {
    // Do something...
}

L’appel d’authentification ci-dessus va:

  • Validez que ni le nom d'utilisateur ni le mot de passe ne sont vides.
  • Assurez-vous que le nom d'utilisateur/mot de passe est correctement codé (UTF-8 par défaut)
  • Essayez un autre serveur LDAP au cas où l'un d'entre eux serait en panne.
  • Cryptez la demande d'authentification à l'aide de TLS.
  • Fournissez des informations supplémentaires en cas d'échec (compte verrouillé/désactivé, etc.)

Il existe d'autres bibliothèques pour le faire aussi (comme Adldap2). Cependant, je me suis senti contraint de fournir des informations supplémentaires, car la réponse la plus votée est en réalité un risque de sécurité sur lequel on ne peut compter que si aucune entrée n’est validée et que TLS n’est pas utilisé.

14
ChadSikorra

Je le fais simplement en transmettant les informations d'identification de l'utilisateur à ldap_bind ().

http://php.net/manual/en/function.ldap-bind.php

Si le compte peut se lier à LDAP, il est valide. si ça ne peut pas, ça ne l'est pas. Si vous ne faites que de l’authentification (et non de la gestion de compte), je ne vois pas le besoin d’une bibliothèque.

11
Scott Reynen

J'aime la classe Zend_Ldap , vous ne pouvez utiliser que cette classe dans votre projet, sans le Zend Framework.

9
CMS

PHP a des bibliothèques: http://ca.php.net/ldap

PEAR propose également un certain nombre de packages: http://pear.php.net/search.php?q=ldap&in=packages&x=0&y=

Je n'ai pas utilisé non plus, mais j'y allais à un moment donné et ils semblaient devoir travailler.

6
Darryl Hein

Pour ceux qui recherchent un exemple complet, consultez http://www.exchangecore.com/blog/how-use-ldap-active-directory-authentication-php/ .

J'ai testé cette connexion aux contrôleurs de domaine Windows Server 2003 et Windows Server 2008 R2 à partir d'un serveur Web Windows Server 2003 (IIS6) et d'une entreprise Windows Server 2012 exécutant IIS 8.

5
Joe Meyer