2009-02-13 22 views
35

Mój projekt polega na stworzeniu systemu rejestracji modułów dla naszej uczelni. Skontaktowałem się więc z informatykami z mojej uczelni, aby uzyskać szczegóły dotyczące uwierzytelnienia uczniów w systemie. Rozwijamy system przy użyciu istniejącego loginu uniwersyteckiego. Dali mi trochę informacji LDAP, nie wiem, jak to wykorzystać. Używam PHP, Mysql na serwerze Apacha. Jak mogę uwierzytelnić logowanie użytkownika do mojego systemu, biorąc pod uwagę jego identyfikator użytkownika i hasło z informacjami LDAP.Uwierzytelnianie użytkownika przy użyciu LDAP z PHP

Poniżej zamieszczono informacje LDAP (i zmienili nazwę domeny itp)

informacje LDAP dla domeny 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

Jeśli serwer jest Linuksa, nie będzie w stanie rozmawiać z AD bez odpowiedniego certyfikatu. Może to stanowić problem, jeśli potrzebujesz pomocy ze strony Univerity. –

Odpowiedz

52

Ogólna procedura byłaby (odpowiednie ext/ldap polecenia php w nawiasach):

  1. połączyć się z serwerem LDAP przy użyciu "host LDAP" i "Nie portu LDAP" (ldap_connect()) i ustawić właściwy Opcje połączeniowe (ldap_set_option()), zwłaszcza LDAP_OPT_PROTOCOL_VERSION i LDAP_OPT_REFERRALS

  2. wiążą się z serwerem LDAP przy użyciu „LDAP konta do wiązania” i „hasło konta LDAP” (ldap_bind()) - jeśli uwierzytelnianie na serwerze Active Directory Państwo mogą bezpośrednio użyj u nazwa użytkownika i hasło ze strony logowania i pomiń wszystkie poniższe kroki.

  3. przeszukać Drzewko za dopasowanie dla wejścia/przedmiotu przez specifing „Base DN” i odpowiedni filtr LDAP - najbardziej prawdopodobne coś podobnego (&(objectClass=user)(sAMAccountName=%s)) gdzie %s powinny zostać zastąpione przez nazwę użytkownika, aby być uwierzytelniony (ldap_search())

  4. sprawdzić, czy liczba zwracanych wpisów jest 1 (jeśli <> 1, to coś poszło nie tak, np żaden użytkownik nie znaleziono lub znaleźć wielu użytkowników)

  5. sprowadzaniu nazwa wyróżniająca (DN) ten pojedynczy wpis (ldap_get_dn())

  6. używać DN znalezione w ostatnim kroku, aby spróbować związać się z serwerem LDAP z hasłem podanym na stronie uwierzytelniania (ldap_bind())

  7. jeżeli wiążą się powiedzie, to wszystko jest OK, jeśli nie, to najprawdopodobniej hasło jest nieprawidłowe

To naprawdę nie jest tak trudne, jak się wydaje na początku. Generalnie proponuję użyć jakiejś standardowej biblioteki do uwierzytelniania na serwerze LDAP, takim jak pakiet PEAR Net_LDAP2 z poziomu Zend_Ldap z wersji Zend_Ldap. Nie mam żadnego doświadczenia z faktycznym używaniem Net_LDAP2 (chociaż znam go całkiem dobrze), ale Zend_Ldap działa bardzo dobrze przeciwko serwerom Active Directory lub serwerom ADAMS (z czym oczywiście pracujesz).

to załatwi za pomocą 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

Po prostu podążyłem za niektórymi z twoich kroków i sprawiłem, że działał jak czar ... przeszedł przez natywną ścieżkę modułu PHP LDAP. –

+0

Tylko ostrzeżenie dla tych, którzy używają tej metody: jeśli serwer LDAP umożliwia anonimowe logowanie, przed próbą autoryzacji odfiltruj puste hasła jako niepoprawne. – Tyzoid

+0

Jestem uwierzytelniania na serwerze Active Directory, ale nadal musiałem przejść przez wszystkie kroki do 7. – Jibbyj

2

można użyć http://pear.php.net/package/Net_LDAP2/docs miło i pracuje.

Przykład związku przyjąć 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 umieszczono zalety. Oto mój prosty kod PHP do uwierzytelnienia przy użyciu AD:

  1. Najpierw musisz znać te parametry: host serwera, domena użytkownika (potrzebujesz również base dn, jeśli chcesz zapytanie AD).
  2. użyć następującego kodu:

    $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. 
    } 
    
Powiązane problemy