Автентифікація в PHP за допомогою LDAP через Active Directory


104

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

  • Редагувати: я вважаю за краще бібліотеку / клас з кодом, який готовий до роботи ... Було б нерозумно вигадувати колесо, коли хтось це вже зробив.

Я думаю, що в drupal є модуль для thatr
redben

Відповіді:


167

Імпорт цілої бібліотеки здається неефективним, коли все, що вам потрібно, це по суті два рядки коду ...

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

43
Деякі установки AD будуть прив’язані успішно, якщо вказаний пароль порожній. Стережися цього! Можливо, вам доведеться забезпечити незаповнений пароль, перш ніж спробувати перевірити автентифікацію.
діолемо

@diolemo Чи є спосіб запобігти цьому, не перевіряючи, чи пароль порожній?
Naftali aka Neal

@Neal Ви можете використати, ldap_set_optionщоб змусити себе вести себе по-іншому. Можливо, встановлення версії протоколу? Вам доведеться експериментувати. Я особисто запропонував би вам перевірити, чи немає пароля в будь-якому випадку, щоб бути безпечним.
діолемо


Анонімному редактору: ні, наскільки мені відомо, тут не потрібно вводити санітарну обробку, як це стосується, ldap_bindі спеціальні символи не є проблемою.
ceejayoz

14

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


1
Для підключень LDAP TLS застаріло на користь StartTLS: openldap.org/faq/data/cache/605.html .
zenlord

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

12

Я роблю це просто, передаючи облікові дані користувача ldap_bind ().

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

Якщо обліковий запис може прив’язатись до LDAP, він дійсний; якщо не може, це не так. Якщо все, що ви робите, - це автентифікація (а не управління рахунком), я не бачу потреби в бібліотеці.


9

Мені подобається клас Zend_Ldap , ви можете використовувати лише цей клас у своєму проекті, без Zend Framework.


1
Я пережив проблему впровадження вищезазначеного, щоб виявити, що керування не є автентичним Я маю намір перейти на zend.auth.adapter.ldap
vdidxho


5

Для тих, хто шукає повний приклад, ознайомтеся з 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.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.