Я пишу фильтр ISAPI для веб-сервера, который мы запускаем в DMZ. Этот фильтр ISAPI должен подключаться к нашим внутренним контроллерам домена для проверки подлинности в Active Directory. В брандмауэре есть правило разрешить трафик с сервера DMZ на наш контроллер домена на порте 636, а брандмауэр показывает, что трафик проходит через штраф. Проблема заключается в функции ldap_connect()
. При попытке установить соединение возникает ошибка 0x51 Server Down
. Мы используем IP-адрес контроллера домена вместо имени DNS, поскольку веб-сервер находится вне домена.Ошибка аутентификации LDAP фильтра ISAPI на сервере DMZ
ISAPI код подключения LDAP:
// Set search criteria
strcpy(search, "(sAMAccountName=");
strcat(search, username);
strcat(search, ")");
// Set timeout
time.tv_sec = 30;
time.tv_usec = 30;
// Setup user authentication
AuthId.User = (unsigned char *) username;
AuthId.UserLength = strlen(username);
AuthId.Password = (unsigned char *) password;
AuthId.PasswordLength = strlen(password);
AuthId.Domain = (unsigned char *) domain;
AuthId.DomainLength = strlen(domain);
AuthId.Flags = SEC_WINNT_AUTH_IDENTITY_ANSI;
// Initialize LDAP connection
ldap = ldap_sslinit(servers, LDAP_SSL_PORT, 1);
if (ldap != NULL)
{
// Set LDAP options
ldap_set_option(ldap, LDAP_OPT_PROTOCOL_VERSION, (void *) &version);
ldap_set_option(ldap, LDAP_OPT_SSL, LDAP_OPT_ON);
// Make the connection
//
// FAILS HERE!
//
ldap_response = ldap_connect(ldap, &time);
if (ldap_response == LDAP_SUCCESS)
{
// Bind to LDAP connection
ldap_response = ldap_bind_s(ldap, (PCHAR) AuthId.User, (PCHAR) &AuthId, LDAP_AUTH_NTLM);
}
}
// Unbind LDAP connection if LDAP is established
if (ldap != NULL)
ldap_unbind(ldap);
// Return string
return valid_user;
servers = <DC IP Address>
Я тестировал этот код на моей локальной машине, которая находится в пределах того же домена AD, и она работает, как LDAP и LDAP через SSL. У нас есть сертификат сервера, установленный на нашем контроллере домена, из политики регистрации Active Directory, но я прочитал в другом месте, что мне может понадобиться также установить клиентский сертификат (для нашего веб-сервера). Это правда?
Кроме того, у нас есть отдельный сайт Wordpress, работающий на том же веб-сервере DMZ, который прекрасно подключается к LDAP через SSL. Он использует OpenLDAP через PHP для подключения и использует IP-адрес наших контроллеров домена для подключения. У нас есть файл ldap.conf, который с линией кода: TLS_REQCERT never
. Есть ли способ имитировать этот эффект в Visual C с тем, что я пытаюсь сделать для фильтра ISAPI? Надеемся, что это проблема программирования, а не проблема с сертификатом. Если это выходит за рамки программирования, сообщите мне или перенаправите меня на лучшее место, чтобы опубликовать это.
Спасибо!
Вам здесь не нужен сертификат клиента. Можете ли вы получить сетевую трассировку и посмотреть, что происходит? –
Кроме того, настройте свой фильтр на '(& (objectCategory = person) (objectClass = пользователь) (samAccountName = ...))'. Это будет более эффективно. –
О, еще одна вещь, я считаю, что вам нужна простая привязка, а не NTLM. –