Как искать и обновлять данные пользователя из Active Directory, используя LDAP в php? - PullRequest
0 голосов
/ 29 апреля 2018

Я использую php 5.6 и пытаюсь найти пользователя в Active Directory по LDAP в php. Пример поиска:

ldap_connect($host, '389');
ldap_search($client, 'DC=shamsa,DC=real,DC=kamchatka,DC=ru', '(&(objectClass=user)(CN=user_name))', '*');

Я успешно получаю данные пользователя, но userPassword не существует в возвращаемых полях. Мне нужен пароль пользователя для сравнения пароля от активных данных и пароля, введенного пользователем.

Как я могу получить пароль пользователя из Active Data или как сравнить пароль, введенный пользователем и пароль в Active Directory без получения?

Кстати, мне также нужно обновить данные пользователя в Active Directory. Например, обновить имя и адрес электронной почты. Как я могу это сделать?

Спасибо за ответы.

Ответы [ 2 ]

0 голосов
/ 29 апреля 2018

Используйте ldap_modify для обновления записи ldap. Все довольно просто:

$entry['mail'] = 'example@domain.com';
$entry['cn'] = 'test';
ldap_modify($connection, $dn, $entry);

userPassword - это операционный атрибут .

Операционный атрибут используется внутренне сервером. Как правило, он читается, но не может быть изменен пользователем.

Чтобы получить операционный атрибут , вы должны явно его потребовать или запросить все их, используя специальный атрибут + (как вы сделали с *, чтобы запросить всех пользователя атрибуты).

Вы также можете запросить все (как пользовательские, так и рабочие) атрибуты с помощью:

ldap_search($connection, $base_dn, $filter, ['*', '+']);

Теперь вы хотите сравнить представленный пароль пользователя со строкой хеша пароля, хранящейся в AD. Это означает, что вам нужно вручную зашифровать / хэшировать / засолить переданную строку в соответствии со схемой хеширования, используемой в AD (например, {SSHA}, {SHA}, {SMD5}, {MD5}, {CRYPT}, ...), чтобы сравнение было возможным.

Вот пример того, как вручную создать хеш {MD5} на основе открытого текста пароля:

$hash = '{md5}' . base64_encode(pack('H*', md5($clear_txt_passwd)));

=> Это не так просто, и совпадение не гарантируется, даже если входная строка верна, так как вы можете столкнуться с проблемами взаимодействия между реализациями ldap и / или системами / ОС (хэш-функции / соли могут отличаться от одного до другой, особенно с использованием библиотеки crypt, которая зависит от системы).

Если вы хотите проверить аутентификацию пользователя непосредственно на AD, просто используйте ldap_bind :

$bind = ldap_bind($connection, $dn, $passwd); // returns TRUE on success, FALSE on failure.
echo "$dn\n" . ($bind ? 'LDAP bind OK' : 'LDAP bind failed');

Но если, например, необходимо проверять учетные данные пользователей как на существующем сервере openLdap, так и на AD, для этого потребуется постоянно синхронизировать / реплицировать записи пользователя, вместо этого лучше сохранить один единый сервер аутентификации. В таком случае вам придется использовать сквозную аутентификацию с использованием выделенной схемы {SASL} в 1-м бэкэнде (в данном примере openLDAP): в этой конфигурации Cyrus SASL используется в качестве обработчика пароля, а делегирует проверку пароля на любой внутренний сервер с поддержкой SASL для проверки паролей (в вашем случае AD, но это может быть Kerberos или IMAP-сервер).

0 голосов
/ 29 апреля 2018

Если вы хотите сравнить только пароль, предоставленный пользователем в интерфейсе входа, с паролем, хранящимся в LDAP / Active Directory, вы должны использовать команду ldap_bind для этого с пользователями dn и паролем. Возвращает true, если пароль и имя пользователя / DN совпадают, и false, если нет.

Чтобы получить DN, вы обычно связываетесь с известным пользователем, у которого есть доступ на чтение к ldap, ищите пользователя по его имени, а затем снова связываетесь с возвращенными пользователями DN и паролем. Существует суть, иллюстрирующая, что на https://gist.github.com/heiglandreas/5689592

Если вы также хотите установить пароль пользователя, который вы хотите связать с пользователем, а также обычно только пользователь (и учетные записи администратора) могут читать (и писать) пароль пользователя , Поэтому вы также хотели бы продолжить, как и раньше, но затем добавить вызов для обновления атрибута пароля пользователя. Для решения и более глубоких знаний взгляните на f.e. http://www.letu.edu/people/markroedel/netcccu/activedirectorypasswordchanges.htm

Обновление других пользовательских данных, кроме пароля, также будет выполнено с помощью ldap_modify или ldap_mod_replace

...