Аутентификация в 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.

Ответ 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.