如何在Windows中使用PHP中的GSS-API机制执行LDAP SASL绑定到Active Directory


How to perform a LDAP SASL bind to Active Directory using GSS-API mech in PHP from Windows?

我有一个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