Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Authenticating in PHP using LDAP through Active Directory

I'm looking for a way to authenticate users through LDAP with PHP (with Active Directory being the provider). Ideally, it should be able to run on IIS 7 (adLDAP does it on Apache). Anyone had done anything similar, with success?

  • Edit: I'd prefer a library/class with code that's ready to go... It'd be silly to invent the wheel when someone has already done so.
like image 420
DV. Avatar asked Oct 05 '08 04:10

DV.


People also ask

How does LDAP authentication work with AD?

LDAP extracts information from AD with a simple, string-based query. LDAP can also share the extracted information (such as usernames and passwords) with connected devices or applications. Using LDAP eliminates the need for users to manually enter a string of LDAP queries to retrieve information from AD.

What is LDAP PHP?

LDAP is the Lightweight Directory Access Protocol, and is a protocol used to access "Directory Servers". The Directory is a special kind of database that holds information in a tree structure.

What are three ways to LDAP authenticate?

LDAP v3 supports three types of authentication: anonymous, simple and SASL authentication.


2 Answers

Importing a whole library seems inefficient when all you need is essentially two lines of code...

$ldap = ldap_connect("ldap.example.com"); if ($bind = ldap_bind($ldap, $_POST['username'], $_POST['password'])) {   // log them in! } else {   // error message } 
like image 93
ceejayoz Avatar answered Oct 21 '22 20:10

ceejayoz


You would think that simply authenticating a user in Active Directory would be a pretty simple process using LDAP in PHP without the need for a library. But there are a lot of things that can complicate it pretty fast:

  • You must validate input. An empty username/password would pass otherwise.
  • You should ensure the username/password is properly encoded when binding.
  • You should be encrypting the connection using TLS.
  • Using separate LDAP servers for redundancy in case one is down.
  • Getting an informative error message if authentication fails.

It's actually easier in most cases to use a LDAP library supporting the above. I ultimately ended up rolling my own library which handles all the above points: LdapTools (Well, not just for authentication, it can do much more). It can be used like the following:

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... } 

The authenticate call above will:

  • Validate that neither the username or password is empty.
  • Ensure the username/password is properly encoded (UTF-8 by default)
  • Try an alternate LDAP server in case one is down.
  • Encrypt the authentication request using TLS.
  • Provide additional information if it failed (ie. locked/disabled account, etc)

There are other libraries to do this too (Such as Adldap2). However, I felt compelled enough to provide some additional information as the most up-voted answer is actually a security risk to rely on with no input validation done and not using TLS.

like image 45
ChadSikorra Avatar answered Oct 21 '22 20:10

ChadSikorra