我有一个Active Directory服务器和一个Windows WAMP服务器,托管PHP web应用程序,需要能够使用Kerberos对Active Directory进行身份验证。
我能够使用一些示例PHP代码轻松地连接和绑定到Active Directory主机,但是我不确定如何使用Kerberos实现这一点。我看过很多论坛和博客,详细介绍了如何在*NIX机器上做到这一点,但这对我的情况没有帮助。
我确实使用了Wireshark和Fiddler来确认没有发生Kerberos或NTLM协商。
我用来连接和绑定LDAP的示例代码:<?php
$ldaphost = "example.domain.com";
$ldapport = 389;
$ldapuser = "user";
$ldappass = "password";
$ldapconn = ldap_connect( $ldaphost, $ldapport )
or die( "Unable to connect to the LDAP server {$ldaphost}" );
if ($ldapconn)
{
$ldapbind = ldap_bind($ldapconn, $ldapuser, $ldappass);
if ($ldapbind)
{
echo "LDAP connection successful";
}
else
{
echo "LDAP connction failed";
}
}
?>
任何帮助将非常感激,谢谢!
更新:我一整天都在努力解决这个问题,我想我需要使用ldap_sasl_bind(),可能使用GSSAPI作为机制…无论我在ldap_sasl_bind()中输入什么参数,我都会得到以下错误:'无法绑定到服务器:未知的身份验证方法'
我不确定如何实现GSSAPI,但我看到的一些例子显示使用ldap_start_tls(),但我一直得到一个'无法启动TLS:服务器不可用'的错误。
我不知道是否有人知道ldap_sasl_bind() (PHP未记录)或ldap_start_tls,但如果这是我应该走的路,请指出我在正确的方向。
我还不能帮助解决Kerberos问题,因为我自己也在努力解决这个问题。不过,我可以为您指出TLS的正确方向。TLS至少可以防止您的凭据以明文形式在网络上传输。TLS需要正确配置OpenLDAP。至少,您可以将客户机配置为不请求或检查任何服务器证书。为此,您可以在ldap.conf配置文件的顶部添加以下行。
TLS_REQCERT never
您的ldap.conf文件应该位于C:'或C:'openldap'sysconf,具体取决于您的PHP和openldap版本。该文件很可能还不存在于您的安装程序中。您也可以通过环境变量以及putenv(TLS_REQCERT=never);
来设置配置,但我自己没有尝试过,并且其他人报告的结果似乎是混合的。
您需要做的是:确保PHP中的LDAP接口是针对SASL编译的,支持GSS-API机制,并且使用键选项卡或windows自己的SSPI接口。好运。
我在windows上通过创建基于c++的ldap_bind_s的可执行文件解决了这个问题。我使用这个可执行文件作为命令行,其中包含以下参数:主机、用户名、密码。这是我让它为GSSAPI工作的唯一方法。
<>之前WINLDAPAPI ULONG LDAPAPILDAP * ld,const PSTR dn;const PCHAR;ULONG方法);之前我使用了LDAP_AUTH_NEGOTIATE