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

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

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

Думаю, в drupal есть модуль для этого

redben 20.06.2010 15:29
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Symfony Station Communiqué - 7 июля 2023 г
Symfony Station Communiqué - 7 июля 2023 г
Это коммюнике первоначально появилось на Symfony Station .
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Установка и настройка Nginx и PHP на Ubuntu-сервере
Установка и настройка Nginx и PHP на Ubuntu-сервере
В этот раз я сделаю руководство по установке и настройке nginx и php на Ubuntu OS.
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Как установить PHP на Mac
Как установить PHP на Mac
PHP - это популярный язык программирования, который используется для разработки веб-приложений. Если вы используете Mac и хотите разрабатывать...
108
1
178 341
6
Перейти к ответу Данный вопрос помечен как решенный

Ответы 6

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

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

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

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

Я столкнулся с трудностями при реализации вышеизложенного, чтобы обнаружить, что это было для управления без аутентификации. Я собираюсь перейти на zend.auth.adapter.ldap

vdidxho 16.03.2018 17:47

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

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

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

Ответ принят как подходящий

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

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

Некоторые установки AD успешно связываются, если предоставленный пароль пуст. Остерегайтесь этого! Возможно, вам потребуется убедиться, что пароль не пустой, перед попыткой аутентификации.

diolemo 20.10.2011 20:32

@diolemo Есть ли способ предотвратить это, не проверяя, пуст ли пароль?

Naftali aka Neal 15.10.2013 02:00

@Neal Вы можете использовать ldap_set_option, чтобы заставить его вести себя по-другому. Возможно установка версии протокола? Придется поэкспериментировать. Я бы лично посоветовал вам в любом случае проверить пустой пароль на всякий случай.

diolemo 16.10.2013 02:54

@diolemo Я задал новый вопрос по этому поводу.

Naftali aka Neal 16.10.2013 18:56

Анонимному редактору: нет, насколько мне известно, дезинфекция ввода здесь не требуется, поскольку ldap_bind будет обрабатывать ее, а специальные символы не являются проблемой.

ceejayoz 09.01.2014 01:34

Я предполагаю, что на сервере должно быть включено расширение php_ldap.dll.

shasi kanth 29.01.2014 10:55

@windowsuser: мне пришлось скопировать несколько dll в системный каталог, чтобы он заработал. Попробуйте это: wptidbits.com/webs/enable-php-ldap-module-in-xampp

Lucian Depold 04.04.2014 15:56

Вы также можете использовать имя пользователя вместо имени пользователя для аутентификации: $binddn = "CN=Dummy User,CN=Users,DC=domain,DC=local";ldap_bind( $ldap,$binddn , $password );

Anant Gupta 22.09.2014 18:31

Ядро Exchange написало прекрасную рабочую статью в блоге по этому поводу здесь: exchangecore.com/blog/…

NixMan 20.10.2018 18:04

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

Вы могли бы подумать, что простая аутентификация пользователя в Active Directory будет довольно простым процессом с использованием LDAP в PHP без необходимости в библиотеке. Но есть много вещей, которые могут очень быстро усложнить задачу:

  • Вы должны подтвердить ввод. В противном случае прошло бы пустое имя пользователя / пароль.
  • Вы должны убедиться, что имя пользователя / пароль правильно закодированы при привязке.
  • Вы должны шифровать соединение с помощью TLS.
  • Использование отдельных серверов LDAP для резервирования в случае отказа одного из них.
  • Получение информативного сообщения об ошибке в случае сбоя аутентификации.

На самом деле в большинстве случаев проще использовать библиотеку LDAP, поддерживающую вышеуказанное. В конце концов, я создал свою собственную библиотеку, которая обрабатывает все вышеперечисленные пункты: LdapИнструменты (ну, не только для аутентификации, она может намного больше). Его можно использовать следующим образом:

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 TLS устарел и заменен StartTLS: openldap.org/faq/data/cache/605.html.

zenlord 12.04.2016 20:27

@zenlord Использование формата ldaps:// для подключения устарело. В моем примере, когда вы указываете setUseTls(true), он использует формат ldap://, а затем выдает StartTLS с использованием ldap_start_tls($connection). Таким образом, сам TLS не устарел, просто подключается с помощью ldaps:// (который на самом деле подключается к LDAP через совершенно другой порт).

ChadSikorra 12.04.2016 23:34

Другие вопросы по теме