2009-02-13 19 views
35

Mi proyecto es crear un sistema de inscripción de módulos para nuestra universidad. Así que me puse en contacto con la gente de TI de mi universidad para obtener detalles para autenticar a los estudiantes en el sistema. Estamos desarrollando el sistema utilizando el inicio de sesión de la universidad existente. Me dieron información LDAP, no sé el uso de eso. Estoy usando PHP, Mysql en un servidor Apacha. ¿Cómo puedo autenticar un usuario que inicia sesión en mi sistema, dado su ID de usuario y contraseña con la información LDAP?Autenticando al usuario usando LDAP desde PHP

A continuación se realiza la información LDAP (he cambiado el nombre de dominio, etc.)

información de LDAP para el dominio 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 el servidor es una máquina Linux, usted no será capaz de hablar con AD y sin un certificado de servidor adecuado. Esto puede ser un problema si necesita ayuda de la Universidad. –

Respuesta

52

El procedimiento general sería (comandos php ext/LDAP correspondiente entre paréntesis):

  1. conectarse al servidor LDAP utilizando el "host LDAP" y "ningún puerto LDAP" (ldap_connect()) y establecer la correcta opciones de conexión (ldap_set_option()), especialmente LDAP_OPT_PROTOCOL_VERSION y LDAP_OPT_REFERRALS

  2. se unen al servidor LDAP mediante la "cuenta de LDAP para enlazar" y "contraseña de la cuenta LDAP" (ldap_bind()) - si está autenticando en un servidor de Active Directory Puede directamente usa tu sername y contraseña de la página de inicio de sesión y omita todos los pasos siguientes.

  3. Buscar en el árbol por un usuario coincidente entrada/objeto especificando el del "DN base" y el filtro LDAP adecuado - muy probablemente algo así como (&(objectClass=user)(sAMAccountName=%s)) donde %s debe sustituirse por el nombre de usuario para autenticar (ldap_search())

  4. de verificación si el número de entradas devueltas es 1 (si <> 1, entonces algo ha ido mal, por ejemplo, no se encontró al usuario o varios usuarios encontrado)

  5. retrive el nombre distinguido (DN) de esta sola entrada (ldap_get_dn())

  6. utilizar el DN encontrado en el último paso para tratar de enlazar con el servidor LDAP con la contraseña proporcionada en la página de autenticación (ldap_bind())

  7. si el enlace tiene éxito, entonces todo está bien, si no, lo más probable la contraseña es incorrecta

Realmente no es tan difícil como parece al principio. En general, propongo utilizar algún tipo de biblioteca estándar para autenticar contra un servidor LDAP como el paquete Net_LDAP2 PEAR o Zend_Ldap del Zend Framework. No tengo experiencia en usar realmente Net_LDAP2 (aunque conozco el código bastante bien) pero Zend_Ldap funciona muy bien contra servidores de Active Directory o servidores ADAMS (que obviamente es con lo que estás trabajando).

esto va a hacer el truco usando 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

Simplemente siguió algunos de sus pasos y consiguió que esto funcionara como un amuleto ... pasó la ruta del módulo PHP LDAP nativo. –

+0

Solo una palabra de advertencia para los que usan este método: si su servidor ldap permite el inicio de sesión anónimo, asegúrese de filtrar las contraseñas vacías como no válidas antes de intentar la autenticación. – Tyzoid

+0

Me estoy autenticando contra un servidor de Active Directory, pero aún tuve que pasar por todos los pasos hasta 7. – Jibbyj

2

podría utilizar http://pear.php.net/package/Net_LDAP2/docs que es agradable y obras.

Ejemplo de conexión tomada por el 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 proporcionado buenos puntos. Aquí está mi código PHP simple para autenticarse con AD:

  1. Primero necesita conocer estos parámetros: servidor host, dominio de usuario (también necesita base dn si desea consultar AD).
  2. utilizar el siguiente código:

    $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. 
    } 
    
Cuestiones relacionadas