2008-10-05 6 views
93

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

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

Я думаю, что у drupal есть модуль для этого – redben 2010-06-20 11:29:03

ответ

147

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

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

Некоторые установки AD будут успешно связываться, если предоставленный пароль пуст. Следите за этим! Перед попыткой аутентификации вам может потребоваться непустой пароль. – diolemo 2011-10-20 16:32:55

+0

@diolemo Есть ли способ предотвратить это, не проверив, является ли пароль пустым? – Neal 2013-10-14 22:00:07

8

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

11

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

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

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

11

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

Проверять подлинность вызова выше будет:

  • Validate, что ни имя пользователя или пароль пуст.
  • Убедитесь, что имя пользователя/пароль правильно закодировано (UTF-8 по умолчанию)
  • Попробуйте использовать альтернативный сервер LDAP в случае, если один из них выключен.
  • Шифровать запрос аутентификации с использованием TLS.
  • Предоставить дополнительную информацию, если она не удалась (то есть. Заперто/отключенная учетная запись, и т.д.)

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

 Смежные вопросы

  • Нет связанных вопросов^_^