Lightweight Directory Access Protocol (LDAP)


LDAP est un protocole d'interrogation des services d'annuaire. Typiquement, j'ai le nom d'une personne, je veux connaitre son email, c'est en interrogeant un annuaire LDAP que je peux obtenir cette information.

Personnellement, j'ai travaillé sur le protocole LDAP avec des serveurs Lotus Notes, mais Active Directory chez Microsoft et eDirectory chez Novell proposent également un support LDAP.

J'utilise principalement LDAP pour authentifier mes utilisateurs. A partir de leur compte et mot de passe Notes, je récupère un attribut de l'annuaire (EmployeeID) qui me sert d'identifiant unique [1]. Je peux alors gérer les droits de l'utilisateur dans mon application sans avoir à lui définir un nouveau mot de passe.

Sous Windows, il existe une DLL permettant de travailler sous LDAP...dont le nom m'échappe...mais peu importe, j'aime comprendre ce que je fais, alors j'ai redéveloppé le protocole LDAP en natif Delphi :)

Contrairement à la plus part des protocoles Internet, LDAP ne travaille pas en mode texte. Le données sont codées en binaires. Il est donc un peu moins simple à mettre en oeuvre. Les données LDAP s'emboitent dans ce que j'ai appelé des "Chunk"; la fonction Chunk() permet d'en créer un pour envoyer une requête au serveur alors que la fonction GetChunk() permet de décoder la réponse.

Mon unité LDAP ne propose pas de classe Delphi, mais quelques fonctions simples pour interroger un annuaire LDAP.

// Connexion au serveur
function LDAPOpen(Server:string; Port:integer=389):integer;
// Authentification LDAP
function LDAPBind(LDAP:integer; Name,Password:string):boolean;
// Retrouver son "Distinguished Name"
function LDAPWhoAmI(LDAP:integer):string;
// Attributs LDAP
function LDAPCaps(LDAP:integer):string;
// Retrouver le "Distinguished Name" d'après le login
function LDAPSearch(LDAP:integer; Name:string):string;
// Retrouver un l'attribut LDAP d'après le "Distinguished Name"
function LDAPAttribute(LDAP:integer; DN,Attribute:string):string;
// fermer la session LDAP
procedure LDAPClose(var LDAP:integer);

Voici un exemple de code utilisant mon unité :
procedure login(const user,pass:string; var id,FullName:string);
var
 ldap:integer;
 dn  :string;
begin
 ldap:=LDAPOpen('ldap_serveur');
 if (ldap=INVALID_SOCKET) then raise Exception.Create('Serveur de sécurité introuvable');
 try
  dn:=LDAPSearch(ldap,user);                             
  if (dn='') then raise Exception.Create('Compte inconnu');
  if LDAPBind(ldap,dn,pass)=false then raise Exception.Create('Mot de passe invalide');
  id:=LDAPAttribute(ldap,dn,'EmployeeID');
  if id='' then raise Exception.Create('Annuaire incomplet');
  FullName:=LDAPAttribute(ldap,dn,'cn');
 finally
  LDAPClose(ldap);
 end;
end;

[1] sous LDAP, le seul identifiant unique est le DN (Distinguished Name).

Date de dernière modification : 06/12/2007