【发布时间】:2012-06-18 23:50:24
【问题描述】:
我正在为我们在 DMZ 中运行的 Web 服务器编写 ISAPI 过滤器。此 ISAPI 过滤器需要连接到我们的内部域控制器以针对 Active Directory 进行身份验证。防火墙中有一条规则允许从 DMZ 服务器到我们的域控制器的 636 端口上的流量,并且防火墙显示流量可以正常通过。问题在于ldap_connect() 函数。尝试建立连接时出现错误0x51 Server Down。我们使用域控制器 IP 地址而不是 DNS 名称,因为 Web 服务器位于域之外。
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 和基于 SSL 的 LDAP 中都有效。我们在域控制器上安装了来自 Active Directory 注册策略的服务器证书,但我在其他地方读到我可能还需要安装客户端证书(用于我们的 Web 服务器)。这是真的?
此外,我们有一个单独的 wordpress 站点运行在同一个 DMZ 网络服务器上,它通过 SSL 连接到 LDAP 就好了。它通过 PHP 使用 OpenLDAP 进行连接,并使用我们的域控制器的 IP 地址进行连接。我们有一个 ldap.conf 文件,其中包含一行代码:TLS_REQCERT never。有没有办法在 Visual C 中用我正在尝试为 ISAPI 过滤器做的事情来模仿这种效果?希望这是一个编程问题,而不是证书问题。如果这超出了编程范围,请告诉我或将我重定向到更好的地方发布此内容。
谢谢!
【问题讨论】:
-
这里不需要客户证书。你能得到一个网络跟踪,看看发生了什么吗?
-
另外,将您的过滤器调整为
(&(objectCategory=person)(objectClass=user)(samAccountName=...))。这样会更有效率。 -
哦还有一件事,我相信你想要一个简单的绑定而不是 NTLM。
-
嗨,Brian,我已经更新了代码以使用简单绑定,但我发现问题实际上是由于网站的应用程序池以网络服务的身份运行的事实引起的。我将应用程序池的身份更改为本地管理员,并且通过 SSL 身份验证的 LDAP 有效。但是,我更喜欢使用默认的网络服务标识。有没有办法做到这一点?
-
在服务器的 hosts 文件中添加 DC 主机条目也有助于解决问题。
标签: ssl active-directory ldap isapi dmz