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

时间:2013-05-29 15:21:29

标签: php active-directory ldap wamp kerberos

我有一个Active Directory服务器和一个托管PHP Web应用程序的Windows WAMP服务器,需要能够使用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,但如果这是我应该采取的方式,请指出我正确的方向。

3 个答案:

答案 0 :(得分:1)

我无法解决Kerberos问题,因为我自己仍然在努力解决这个问题。但是,我可以为TLS指出正确的方向。 TLS至少会阻止您的凭据以明文形式通过网络传输。 TLS需要正确配置OpenLDAP。至少,您可以将客户端配置为不请求或检查任何服务器证书。您可以通过在ldap.conf配置文件的顶部添加以下行来完成此操作。

TLS_REQCERT never

您的ldap.conf文件应位于 C:\ C:\ openldap \ sysconf 中,具体取决于您的PHP和OpenLDAP版本。您的设置中可能尚不存在该文件。您也可以通过环境变量putenv(TLS_REQCERT=never);设置配置,但我自己没有尝试过,并且其他人报告的结果似乎不一致。

答案 1 :(得分:0)

您需要做什么:确保PHP中的LDAP接口是针对SASL编译的,支持GSS-API机制,并使用keytabs或Windows自带的SSPI接口。祝你好运。

答案 2 :(得分:0)

我在Windows上通过创建基于c ++ ldap_bind_s的可执行文件解决了此问题。我将此可执行文件用作带有参数的命令行:主机,用户名,密码。这是我将其用于GSSAPI的唯一方法。

WINLDAPAPI ULONG LDAPAPI ldap_bind_s(
  LDAP        *ld,
  const PSTR  dn,
  const PCHAR cred,
  ULONG       method
);

我使用了LDAP_AUTH_NEGOTIATE。