Uwierzytelnianie w PHP przy użyciu LDAP poprzez Active Directory

Szukam sposobu na uwierzytelnienie użytkowników przez LDAP za pomocą PHP(Active Directory jest dostawcą). Idealnie, powinno być w stanie uruchomić na IIS 7 ( adLDAP robi to na Apache). Ktoś zrobił coś podobnego, z sukcesem?

  • Edit: wolałbym bibliotekę / klasę z kodem, który jest gotowy do pracy... Głupio byłoby wymyślić koło, gdy ktoś już to zrobił.
Author: GEOCHET, 2008-10-05

6 answers

Importowanie całej biblioteki wydaje się nieefektywne, gdy potrzebne są dwie linie kodu...

$ldap = ldap_connect("ldap.example.com");
if ($bind = ldap_bind($ldap, $_POST['username'], $_POST['password'])) {
  // log them in!
} else {
  // error message
}
 152
Author: ceejayoz,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-01-08 21:33:39

Można by pomyśleć, że samo uwierzytelnianie użytkownika w Active Directory byłoby dość prostym procesem wykorzystującym LDAP w PHP bez potrzeby korzystania z biblioteki. Ale jest wiele rzeczy, które mogą to bardzo szybko skomplikować:

  • musisz zweryfikować dane wejściowe. Pusta nazwa użytkownika/hasło przejdzie w przeciwnym razie.
  • Należy upewnić się, że nazwa użytkownika/hasło jest prawidłowo zakodowane podczas wiązania.
  • powinieneś szyfrować połączenie za pomocą protokołu TLS.
  • Używanie oddzielnego LDAP serwery do redundancji w przypadku awarii jednego z nich.
  • otrzymywanie Komunikatu o błędzie informacyjnym w przypadku niepowodzenia uwierzytelniania.

W większości przypadków łatwiej jest użyć biblioteki LDAP obsługującej powyższe. Ostatecznie skończyłem z uruchomieniem własnej biblioteki, która obsługuje wszystkie powyższe punkty: LdapTools (cóż, nie tylko do uwierzytelniania, może zrobić znacznie więcej). Można go używać w następujący sposób:

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

Powyższe wywołanie uwierzytelniające będzie:

  • potwierdź, że ani nazwa użytkownika lub hasło jest puste.
  • Upewnij się, że nazwa użytkownika/hasło jest poprawnie zakodowane (domyślnie UTF-8)
  • Wypróbuj Alternatywny serwer LDAP na wypadek, gdyby jeden z nich nie działał.
  • Zaszyfruj żądanie uwierzytelnienia za pomocą protokołu TLS.
  • podaj dodatkowe informacje, jeśli się nie powiodło (tj. zablokowane / wyłączone konto itp.)

Istnieją również inne biblioteki, które mogą to zrobić (takie jak Adldap2). Jednak czułem się zmuszony do podania dodatkowych informacji, ponieważ najbardziej głosowana odpowiedź jest w rzeczywistości ryzyko bezpieczeństwa, na którym można polegać bez walidacji danych wejściowych i bez korzystania z TLS.

 13
Author: ChadSikorra,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-04-18 01:29:04

Robię to po prostu przekazując poświadczenia użytkownika do ldap_bind ().

Http://php.net/manual/en/function.ldap-bind.php

Jeśli konto może wiązać się z LDAP, jest ważne; jeśli nie, nie jest. Jeśli wszystko, co robisz, to uwierzytelnianie (nie Zarządzanie kontem), nie widzę potrzeby korzystania z biblioteki.

 11
Author: Scott Reynen,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-10-05 13:38:49

Lubię klasę Zend_ldap, możesz używać tylko tej klasy w swoim projekcie, bez Zend Framework.

 8
Author: CMS,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-10-04 18:45:26

PHP posiada biblioteki: http://ca.php.net/ldap

Gruszka posiada również kilka pakietów: http://pear.php.net/search.php?q=ldap&in=packages&x=0&y=0

Ja też nie używałem, ale miałem zamiar w pewnym momencie i wydawało się, że powinny działać.

 6
Author: Darryl Hein,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-10-05 05:11:00

Dla tych, którzy szukają pełnego przykładu sprawdź http://www.exchangecore.com/blog/how-use-ldap-active-directory-authentication-php/.

Przetestowałem to podłączanie do kontrolerów domeny Windows Server 2003 i Windows Server 2008 R2 z serwera www Windows Server 2003 (IIS6) oraz z systemu Windows server 2012 enterprise z systemem IIS 8.

 5
Author: Joe Meyer,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-01-08 19:09:39