Аутентификация в PHP с использованием LDAP через Active Directory
Я ищу способ аутентификации пользователей через LDAP с помощью PHP (с Active Directory, являющимся поставщиком). В идеале он должен работать на IIS 7 (adLDAP делает это на Apache). Кто-нибудь сделал что-то подобное, с успехом?
- Изменить: я бы предпочел библиотеку/класс с кодом, готовым к работе... Было бы глупо изобретать колесо, когда кто-то уже это сделал.
Ответы
Ответ 1
Импорт целой библиотеки кажется неэффективным, когда вам нужно всего две строки кода...
$ldap = ldap_connect("ldap.example.com");
if ($bind = ldap_bind($ldap, $_POST['username'], $_POST['password'])) {
// log them in!
} else {
// error message
}
Ответ 2
Я делаю это просто, передавая учетные данные пользователя ldap_bind().
http://php.net/manual/en/function.ldap-bind.php
Если учетная запись может привязываться к LDAP, она действительна; если он не может, это не так. Если все, что вы делаете, это аутентификация (не управление учетной записью), я не вижу необходимости в библиотеке.
Ответ 3
Вы могли бы подумать, что просто аутентификация пользователя в Active Directory будет довольно простым процессом с использованием LDAP на PHP без необходимости в библиотеке. Но есть много вещей, которые могут усложнить его довольно быстро:
- Вы должны подтвердить ввод. Пустое имя пользователя/пароль будут переданы иначе.
- Вы должны убедиться, что имя пользователя/пароль правильно закодированы при привязке.
- Вы должны шифровать соединение с помощью TLS.
- Использование отдельных серверов LDAP для резервирования в случае, если один из них не работает.
- Получение информационного сообщения об ошибке при неудачной аутентификации.
В большинстве случаев проще использовать библиотеку LDAP, поддерживающую вышеуказанное. В конечном итоге я перевернул свою собственную библиотеку, которая обрабатывает все вышеперечисленные моменты: LdapTools (ну, не только для аутентификации, он может сделать гораздо больше). Его можно использовать следующим образом:
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...
}
Вышеуказанный вызов аутентификации будет:
- Подтвердите, что ни имя пользователя, ни пароль не пусты.
- Убедитесь, что имя пользователя/пароль правильно закодированы (по умолчанию UTF-8)
- Попробуйте альтернативный сервер LDAP, если он отсутствует.
- Зашифровать запрос аутентификации с использованием TLS.
- Предоставьте дополнительную информацию, если она не выполнена (т.е. заблокирована/отключена учетная запись и т.д.)
Для этого есть и другие библиотеки (например, Adldap2). Тем не менее, я чувствовал себя достаточно уверенным, чтобы предоставить дополнительную информацию, поскольку самый опротестованный ответ на самом деле представляет собой угрозу безопасности, на которую можно положиться, без проверки ввода и использования TLS.
Ответ 4
Мне нравится Zend_Ldap Класс, вы можете использовать только этот класс в своем проекте без Zend Framework.
Ответ 5
В PHP есть библиотеки: http://ca.php.net/ldap
PEAR также имеет несколько пакетов: http://pear.php.net/search.php?q=ldap&in=packages&x=0&y=0
Я тоже не использовал, но я собирался в какой-то момент, и им показалось, что они должны работать.
Ответ 6
Для тех, кто ищет полный пример, проверьте http://www.exchangecore.com/blog/how-use-ldap-active-directory-authentication-php/.
Я проверил это подключение к контроллерам домена Windows Server 2003 и Windows Server 2008 R2 с веб-сервера Windows Server 2003 (IIS6) и с сервера Windows Server 2012 с IIS 8.