Intereting Posts
Загрузка файла автозагрузки после отправки формы Процессы убийства открыты с помощью popen ()? php – добавить переменную от двух часов до даты Предупреждение: mysqli_connect (): (28000/1045): доступ запрещен для пользователя Массив PHP для массива jquery через JSON .htaccess config с символическими ссылками и индексными файлами, которые не работают должным образом как использовать php с ini-файлами Как можно запускать несколько версий PHP 5.x на сервере LAMP разработки? Как вернуть HTML-файл в ответ на запрос POST? Как я могу использовать базовую HTTP-аутентификацию в PHP? Конструктор запросов не вставляет временные метки Doctrine 2 – Как использовать столбец дискриминатора в разделе where Преобразование переменной Javascript в переменную PHP почему это не тянет данные с 7 дней назад? Facebook PHP SDK – Пользователь по-прежнему отображается как зарегистрированный в веб-приложении, хотя выходил из Facebook

Аутентификация в PHP с использованием LDAP через Active Directory

Я ищу способ аутентификации пользователей через LDAP с помощью PHP (с Active Directory, являющимся поставщиком). В идеале, он должен работать в IIS 7 ( adLDAP делает это на Apache). Кто-нибудь сделал что-то подобное, с успехом?

  • Редактировать: я бы предпочел библиотеку / класс с кодом, который готов к работе … Было бы глупо изобретать колесо, если кто-то уже это сделал.

Импорт целой библиотеки кажется неэффективным, когда вам нужно всего лишь две строки кода …

$ldap = ldap_connect("ldap.example.com"); if ($bind = ldap_bind($ldap, $_POST['username'], $_POST['password'])) { // log them in! } else { // error message } 

Я делаю это просто, передавая учетные данные пользователя ldap_bind ().

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

Если учетная запись может привязываться к LDAP, она действительна; если он не может, это не так. Если все, что вы делаете, это аутентификация (не управление учетной записью), я не вижу необходимости в библиотеке.

Вы могли бы подумать, что просто аутентификация пользователя в 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.

Мне нравится Zend_Ldap Class, вы можете использовать только этот класс в своем проекте без Zend Framework.

В PHP есть библиотеки: http://ca.php.net/ldap

PEAR также имеет несколько пакетов: http://pear.php.net/search.php?q=ldap&in=packages&x=0&y=0

Я тоже не пользовался, но я собирался в какой-то момент, и им показалось, что они должны работать.

Для тех, кто ищет полный пример, посмотрите 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.