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