2009-02-13 7 views
35

Mon projet consiste à faire un système d'inscription de module pour notre université. J'ai donc contacté les informaticiens de mon université pour obtenir des détails afin d'authentifier les étudiants dans le système. Nous développons le système en utilisant le login universitaire existant. Ils m'ont donné des informations LDAP, je n'en connais pas l'utilité. J'utilise PHP, Mysql sur un serveur Apacha. Comment authentifier un utilisateur qui se connecte à mon système, compte tenu de son ID utilisateur et de son mot de passe avec les informations LDAP.Authentification d'utilisateur utilisant LDAP depuis PHP

Ci-dessous est l'information LDAP (j'ai changé le nom de domaine, etc.)

d'informations LDAP pour le domaine blueroom.ac.uk


LDAP Host : ad.blueroom.ac.uk 

LDAP port no: 389 

BASE DN : ou=bluebird, dc=bluebird, dc=ac, dc=my 

LDAP account to bind : cn = kikdap, ou=servacc, dc=bluebird,dc=ac,dc=uk 

LDAP account password : ******** 

Attribute : sAMAccountName 
+0

Si votre serveur est une boîte de Linux, vous ne serez pas en mesure de parler à AD sans certificat de serveur approprié. Cela peut être un problème si vous avez besoin d'aide de l'Université. –

Répondre

52

Le mode opératoire général serait (pertinents commandes PHP ext/LDAP entre parenthèses):

  1. connecter au serveur LDAP en utilisant le "port LDAP non" "Host LDAP" et (ldap_connect()) et régler le correct options de connexion (ldap_set_option()), en particulier LDAP_OPT_PROTOCOL_VERSION et LDAP_OPT_REFERRALS

  2. se connecter au serveur LDAP à l'aide du « compte LDAP pour lier » et « mot de passe LDAP » (ldap_bind()) - si vous réalisez l'authentification d'un serveur active Directory, vous pouvez directement utilisez le u nom d'utilisateur et mot de passe de la page de connexion et ignorez toutes les étapes suivantes.

  3. rechercher l'arbre pour une entrée utilisateur correspondant/objet en spécifiant le « BASE DN » et le filtre LDAP approprié - quelque chose comme (&(objectClass=user)(sAMAccountName=%s)) le plus probable où %s devrait être remplacé par le nom d'utilisateur à authentifier (ldap_search())

  4. vérifier si le nombre d'entrées renvoyées est 1 (si <> 1 alors quelque chose va mal, par exemple, aucun utilisateur trouvé ou plusieurs utilisateurs trouvés)

  5. retrive le nom distinctif (DN) de cette entrée unique (ldap_get_dn())

  6. utiliser le DN trouvé dans la dernière étape pour essayer de lier au serveur LDAP avec le mot de passe donné à la page d'authentification (ldap_bind())

  7. si l'association réussit alors tout est OK, sinon, le plus probable le mot de passe est faux

Ce n'est vraiment pas aussi dur que ça en a l'air au début. En général, je proposerais d'utiliser une sorte de bibliothèque standard pour l'authentification contre un serveur LDAP tel que le paquet PEAR Net_LDAP2 ou Zend_Ldap sur le Zend Framework. Je n'ai aucune expérience avec l'utilisation réelle Net_LDAP2 (bien que je connais le code assez bien), mais Zend_Ldap fonctionne très bien contre les serveurs Active Directory ou les serveurs ADAMS (ce qui est évidemment ce que vous travaillez).

Cela fera l'affaire en utilisant Zend_Ldap:

$options = array(
    'host'     => 'ad.blueroom.ac.uk', 
    'useStartTls'   => true, 
    'accountDomainName' => 'blueroom.ac.uk', 
    'accountCanonicalForm' => 4, 
    'baseDn'    => 'ou=bluebird,dc=bluebird,dc=ac,dc=my', 
); 
$ldap = new Zend_Ldap($options); 
try { 
    $ldap->bind('user', 'password'); 
} catch (Zend_Ldap_Exception $e) { 
    // something failed - inspect $e 
} 
// bind successful 
$acctname = $ldap->getCanonicalAccountName('user', Zend_Ldap::ACCTNAME_FORM_DN); 
+0

Juste suivi certaines de vos étapes et a obtenu ce travail comme un charme ... est allé le chemin natif du module LDAP PHP à travers. –

+0

Juste un mot de prudence à ceux qui utilisent cette méthode: si votre serveur ldap permet une connexion anonyme, assurez-vous de filtrer les mots de passe vides comme non valides avant d'essayer l'authentification. – Tyzoid

+0

Je m'authentifie sur un serveur Active Directory, mais je devais passer toutes les étapes à 7. – Jibbyj

2

vous pouvez utiliser http://pear.php.net/package/Net_LDAP2/docs il est agréable et travaille.

Exemple de connexion prise par le doc:

// Inclusion of the Net_LDAP2 package: 
require_once 'Net/LDAP.php'; 

// The configuration array: 
$config = array (
    'binddn' => 'cn=admin,ou=users,dc=example,dc=org', 
    'bindpw' => 'password', 
    'basedn' => 'dc=example,dc=org', 
    'host'  => 'ldap.example.org' 
); 

// Connecting using the configuration: 
$ldap = Net_LDAP2::connect($config); 

// Testing for connection error 
if (PEAR::isError($ldap)) { 
    die('Could not connect to LDAP-server: '.$ldap->getMessage()); 
} 
1

@Stephen a donné de bons points. Voici mon simple code PHP pour authentifier en utilisant AD:

  1. vous devez d'abord connaître ces paramètres: hôte du serveur, domaine utilisateur (vous devez également dn de base si vous voulez requête AD).
  2. utiliser le code suivant:

    $ldap = ldap_connect($host); // e.g. 165.5.54.6 or an URL 
    ldap_set_option($ldap, LDAP_OPT_PROTOCOL_VERSION, 3); // Recommended for AD 
    ldap_set_option($ldap, LDAP_OPT_REFERRALS, 0); 
    $bind = ldap_bind($ldap, $username.'@'.$userDomain, $passwrod); 
    
    if($bind){ 
    // successful authentication. 
    } 
    
Questions connexes