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

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

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

6 ответов


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

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

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


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

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

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


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


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

груша также имеет несколько пакетов: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 enterprise под управлением IIS 8.