Подтвердить что ты не робот

Аутентификация пользователя с помощью 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 
4b9b3361

Ответ 1

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

  • подключиться к LDAP-серверу с помощью "LDAP Host" и "LDAP port no" (ldap_connect()) и установить правильное (ldap_set_option()), особенно LDAP_OPT_PROTOCOL_VERSION и LDAP_OPT_REFERRALS

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

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

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

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

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

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

Это действительно не так сложно, как кажется сначала. Как правило, я предлагаю использовать некоторую стандартную библиотеку для аутентификации на сервере LDAP, например, Net_LDAP2 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);

Ответ 3

вы можете использовать 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());
}

Ответ 4

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

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

    $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. 
    }