Аутентификация в PHP с использованием LDAP через Active Directory - PullRequest
99 голосов
/ 05 октября 2008

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

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

Ответы [ 6 ]

159 голосов
/ 05 октября 2008

Импорт всей библиотеки кажется неэффективным, когда все, что вам нужно, это по существу две строки кода ...

$ldap = ldap_connect("ldap.example.com");
if ($bind = ldap_bind($ldap, $_POST['username'], $_POST['password'])) {
  // log them in!
} else {
  // error message
}
14 голосов
/ 09 апреля 2016

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

11 голосов
/ 05 октября 2008

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

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

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

9 голосов
/ 05 октября 2008

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

6 голосов
/ 05 октября 2008

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

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

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

5 голосов
/ 08 января 2014

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

...