Lightweight Directory Access Protocol (LDAP)
APIs et Authentification
Principales APIs pour LDAP
LDAP a été normalisé pour la première fois il y a 15 ans (à la date d'écriture de ce site, en 2008). Aussi, de nombreuses APIs clientes pour LDAP ont été développées, pour tous les langages de développement existant et possédant des capacités de connexion réseau, parmi lesquels :
- Java (intégré dans JNDI, Novell Java LDAP classes)
- C (Mozilla LDAP C SDK)
- C++ (OpenLDAP C++ API)
- PERL (Perl-LDAP classes Net::LDAP)
- Python (LDAP Client API for Python)
- Ruby (Ruby/LDAP)
- .NET (C#, VB.NET, J#, ...) (intégré via les classes System.DirectoryServices)
- ...
Pour chaque langage, il existe une variété de bibliothèques permettant l'utilisation de LDAP. Les informations des sections suivantes concernent les principaux patterns rencontrés dans ces librairies.
Connexion et Authentification
En fonction de la bibliothèque utilisée et des options supportées par l'API utilisée, soit :
- La connexion et l'authentification se font systématiquement ensemble
- Les deux processus se font de façon séparées, en appelant d'abord connect() puis bind()
Généralement, la seconde version est utilisée par les bibliothèques supportant des extensions
comme StartTLS
, pour pouvoir envoyer la demande de création d'une session TLS
avant d'envoyer les informations de connexion.
Par exemple, l'approche Java utilisant JNDI fonctionne sur le premier mode, et les informations de connexion doivent être indiquées avant de créer l'objet représentant la connexion à l'annuaire :
Hashtable env = new Hashtable(); env.put(Context.INITIAL_CONTEXT_FACTORY, "com.sun.jndi.ldap.LdapCtxFactory"); env.put(Context.PROVIDER_URL, "ldap://localhost:10389"); // LDAP Server URL (ldaps for SSL implicit encryption) env.put(Context.SECURITY_AUTHENTICATION, "simple"); // Authentication type, can be SASL env.put(Context.SECURITY_PRINCIPAL, "uid=admin,ou=system"); // specify the username env.put(Context.SECURITY_CREDENTIALS,"secret"); // specify the password /* * Executing this command will do the connect and bind operations, * and a NamingException will be thrown if credentials are incorrect. */ DirContext ctx = new InitialDirContext(env);
Tandis que l'approche Java utilisant les classes JLDAP de Novell différencie la création de l'objet, la connexion et l'opération d'authentification (bindRequest), comme le montre l'exemple suivant :
LDAPConnection lc = new LDAPConnection(); try { // Connects to the LDAP Directory lc.connect("localhost", "10389"); // Binds (authenticates) the user in order to open a session lc.bind(LDAPConnection.LDAP_V3, "uid=admin,ou=system", "secret"); // Unbinds the connection lc.disconnect(); } catch (LDAPException e) { if (e.getResultCode() == LDAPException.INVALID_CREDENTIALS) { System.err.println("Invalid Credentials"); } else { System.err.println("Unexpected error: " + e.getMessage()); } }