У нас есть сайт IIS php, который аутентифицируется в Active Directory с использованием LDAP, в частности, с использованием ldap_connect и ldap_bind. Это работает нормально, но мы готовимся к ожидающему изменению, чтобы разрешить только подписанную привязку LDAP к AD. Когда я обновляю свой код до того, что, по моему мнению, должно работать, я получаю ошибку аутентификации, но не могу вывести фактический код ошибки, чтобы помочь устранить неполадки.
На данный момент привязка TLS отключена в нашем домене контроллеры, я просто хочу использовать привязку AD SSL более 636 (вместо TLS более 389). Мы используем PHP 5.6.30 для IIS 6.1 на сервере Server 2008 R2 ... У нас есть цель миграции, которая представляет собой Server 2016 на IIS 10 и PHP 7.2, и мы видим тот же результат. php_openssl и php_ldap являются включенными расширениями.
Вот текущий код:
$this->AD_SERVER = $config['AD_SERVER'];
assert(is_string($password));
if ($password == "") {
throw new \SimpleSAML\Error\Error('NOPASSWORD');
}
$ldap = ldap_connect($this->AD_SERVER);
$ldaprdn = 'DOMAINPREFIX' . "\\" . $user;
ldap_set_option(NULL, LDAP_OPT_DEBUG_LEVEL, 9);
ldap_set_option($ldap, LDAP_OPT_PROTOCOL_VERSION, 3);
ldap_set_option($ldap, LDAP_OPT_REFERRALS, 0);
$bind = @ldap_bind($ldap, $ldaprdn, $password);
Это прекрасно работает. После этого извлечение атрибутов с использованием «ldap_search» и «ldap_get_entries» проходит успешно. Имя пользователя и пароль предоставляются пользователем, пытающимся пройти аутентификацию; привязка происходит под учетными данными аутентифицирующего пользователя.
Если я изменяю первую строку на следующую, я просто получаю ошибку аутентификации, больше нет описательной ошибки:
$this->AD_SERVER = 'ldaps://'.$config['AD_SERVER'].':636';
assert(is_string($password));
if ($password == "") {
throw new \SimpleSAML\Error\Error('NOPASSWORD');
}
$ldap = ldap_connect($this->AD_SERVER);
$ldaprdn = 'DOMAINPREFIX' . "\\" . $user;
ldap_set_option(NULL, LDAP_OPT_DEBUG_LEVEL, 9);
ldap_set_option($ldap, LDAP_OPT_PROTOCOL_VERSION, 3);
ldap_set_option($ldap, LDAP_OPT_REFERRALS, 0);
$bind = @ldap_bind($ldap, $ldaprdn, $password);
У меня есть перепутал с "LDAP_OPT_X_TLS_REQUIRE_CERT" и отключил другие вещи tls, но это не имеет значения (и я не думал, что это будет).
На контроллере домена, для неудачных попыток, я вообще не вижу ни одного eventID от 2280-2290 (который, я полагаю, выявит ошибки привязки). Кроме того, я вижу только 4776 (попытки аутентификации), когда настроена небезопасная привязка, и я никогда не получаю попытки вообще, когда сбой безопасной привязки. Я считаю, что есть проблема с привязкой, однако я не могу представить какие-либо журналы, чтобы помочь диагностировать ее.
Я нашел много статей, указывающих, как это сделать для openldap, но очень я почти ничего не нашел документирование AD LDAP подписанного связывания. Я видел много людей, которые указали, что мы должны перейти на TLS, поскольку привязка SSL через 636 - это нестандартная вещь LDAP, и она применима только к AD, однако мы действительно хотели бы избежать этого, если это возможно. Любая помощь будет оценена.