Аутентификация пользователя с помощью LDAP из PHP

Мой проект - сделать модульную систему зачисления в наш университет. Поэтому я связался с ИТ-специалистами в моем университете для получения подробной информации по аутентификации студентов в системе. Мы разрабатываем систему с использованием существующего университетского логина. Они предоставили мне некоторую информацию о LDAP, я не знаю, как она используется. Я использую PHP, Mysql на сервере Apacha. Как я могу аутентифицировать пользователя, входящего в мою систему, учитывая его идентификатор пользователя и пароль с информацией LDAP.

Ниже приводится информация о LDAP (я изменил доменное имя и т. Д.)

Информация LDAP для домена blueroom.ac.uk


LDAP Host : ad.blueroom.ac.uk

LDAP port no: 389

BASE DN : ou=bluebird, dc=bluebird, dc=ac, dc=my

LDAP account to bind : cn = kikdap, ou=servacc, dc=bluebird,dc=ac,dc=uk

LDAP account password : ********

Attribute : sAMAccountName 

person Community    schedule 13.02.2009    source источник
comment
Если ваш сервер представляет собой Linux-сервер, вы не сможете общаться с AD без надлежащего сертификата сервера. Это может быть проблемой, если вам нужна помощь Университета.   -  person    schedule 18.08.2010


Ответы (4)


Общая процедура (соответствующие команды ext / ldap php в скобках):

  1. подключитесь к серверу LDAP, используя «Хост LDAP» и «Номер порта LDAP» (ldap_connect ()) и установите правильные параметры подключения (ldap_set_option ()), особенно LDAP_OPT_PROTOCOL_VERSION и LDAP_OPT_REFERRALS

  2. привязать к серверу LDAP, используя «учетную запись LDAP для привязки» и «пароль учетной записи LDAP» (ldap_bind ()) - если вы аутентифицируетесь на сервере Active Directory, вы можете напрямую использовать имя пользователя и пароль со страницы входа и пропустить все следующие шаги.

  3. найдите в дереве соответствующую запись / объект пользователя, указав «BASE DN» и соответствующий фильтр LDAP - скорее всего, что-то вроде (&(objectClass=user)(sAMAccountName=%s)), где %s следует заменить на имя пользователя для аутентификации (ldap_search ())

  4. проверьте, равно ли количество возвращенных записей 1 (если ‹> 1, то что-то пошло не так, например, пользователь не найден или несколько пользователей не найдены)

  5. получить отличительное имя (DN) этой единственной записи (ldap_get_dn ())

  6. используйте DN, найденный на последнем шаге, чтобы попытаться выполнить привязку к серверу LDAP с паролем, указанным на странице аутентификации (ldap_bind ())

  7. если привязка прошла успешно, то все в порядке, если нет, скорее всего, пароль неверный

Это действительно не так сложно, как кажется сначала. Обычно я предлагаю использовать какую-то стандартную библиотеку для аутентификации на сервере LDAP, такую как _5 _ PEAR или Zend_Ldap из Zend Framework. У меня нет опыта фактического использования Net_LDAP2 (хотя я знаю код достаточно хорошо), но Zend_Ldap очень хорошо работает с серверами Active Directory или серверами ADAMS (которые, очевидно, являются тем, с чем вы работаете).

Это поможет использовать Zend_Ldap:

$options = array(
    'host'                 => 'ad.blueroom.ac.uk',
    'useStartTls'          => true,
    'accountDomainName'    => 'blueroom.ac.uk',
    'accountCanonicalForm' => 4,
    'baseDn'               => 'ou=bluebird,dc=bluebird,dc=ac,dc=my',
);
$ldap = new Zend_Ldap($options);
try {
    $ldap->bind('user', 'password');
} catch (Zend_Ldap_Exception $e) {
    // something failed - inspect $e
}
// bind successful
$acctname = $ldap->getCanonicalAccountName('user', Zend_Ldap::ACCTNAME_FORM_DN);
person Stefan Gehrig    schedule 13.02.2009
comment
Просто выполнил некоторые из ваших шагов и заставил это работать как шарм ... прошел собственный маршрут модуля PHP LDAP. - person on_; 20.02.2014
comment
Небольшое предупреждение для тех, кто использует этот метод: если ваш ldap-сервер разрешает анонимный вход, убедитесь, что вы отфильтровали пустые пароли как недействительные перед попыткой аутентификации. - person Tyzoid; 23.07.2014
comment
Я проверяю подлинность на сервере Active Directory, но мне все равно пришлось пройти все шаги до 7. - person Jibby; 10.09.2015

Вы можете попробовать http://code.activestate.com/recipes/101525/, ссылаясь на в http://us3.php.net/ldap и другие результаты поиска Google по запросу [аутентификация php ldap].

person Emil Sit    schedule 13.02.2009

@Stephen дал хорошие отзывы. Вот мой простой PHP-код для аутентификации с помощью AD:

  1. Сначала вам нужно знать эти параметры: хост сервера, домен пользователя (вам также понадобится базовый dn, если вы хотите запросить AD).
  2. используйте следующий код:

    $ldap = ldap_connect($host); // e.g. 165.5.54.6 or an URL
    ldap_set_option($ldap, LDAP_OPT_PROTOCOL_VERSION, 3); // Recommended for AD
    ldap_set_option($ldap, LDAP_OPT_REFERRALS, 0);
    $bind = ldap_bind($ldap, $username.'@'.$userDomain, $passwrod);
    
    if($bind){
    // successful authentication. 
    }
    
person PHPst    schedule 04.06.2015
comment
Осторожно: некоторые реализации LDAP возвращают значение true на ldap_bind, когда пароль пуст. Вероятно, вам следует проверить, не является ли пароль пустым. - person Johann150; 19.07.2018

вы можете использовать http://pear.php.net/package/Net_LDAP2/docs это красиво и работает.

Пример подключения взят из документа:

// Inclusion of the Net_LDAP2 package:
require_once 'Net/LDAP.php';

// The configuration array:
$config = array (
    'binddn'    => 'cn=admin,ou=users,dc=example,dc=org',
    'bindpw'    => 'password',
    'basedn'    => 'dc=example,dc=org',
    'host'      => 'ldap.example.org'
);

// Connecting using the configuration:
$ldap = Net_LDAP2::connect($config);

// Testing for connection error
if (PEAR::isError($ldap)) {
    die('Could not connect to LDAP-server: '.$ldap->getMessage());
}
person damko    schedule 23.07.2009