LDAP Authenticated Bind问题 - PHP,Apache,Windows

时间:2013-04-09 09:31:10

标签: php windows apache ldap

我遇到了对服务器执行经过身份验证的绑定的问题。问题似乎不在代码中,但可能是服务器问题。

就这样你知道;

  • 在Apache / PHP中启用了LDAP
  • 我正在以user@domain.com
  • 进行连接
  • 域控制器已运行LDAP并且防火墙中的条目(Windows Server 2008 R2)
  • 我可以执行匿名绑定

我可以使用此脚本匿名绑定;

$ldapconn = ldap_connect("machinename.domain.com")
    or die("Could not connect to LDAP server.");

if ($ldapconn) {

    // binding anonymously
    $ldapbind = ldap_bind($ldapconn);

    if ($ldapbind) {
        echo "LDAP bind anonymous successful...";
    } else {
        echo "LDAP bind anonymous failed...";
    }

}

但是,当我尝试使用此脚本执行经过身份验证的绑定时,它会失败。

// Authenticated Bind
$ldaprdn  = 'username@domain.com';     // ldap rdn or dn
$ldappass = 'password';  // associated password

// connect to ldap server
$ldapconn = ldap_connect("machinename.domain.com")
    or die("Could not connect to LDAP server.");

if ($ldapconn) {

    // binding to ldap server
    $ldapbind = ldap_bind($ldapconn, $ldaprdn, $ldappass);

    // verify binding
    if ($ldapbind) {
        echo "LDAP bind successful...";
    } else {
        echo "LDAP bind failed...";
    }

}

我哪里错了?

2 个答案:

答案 0 :(得分:0)

您的LDAP可能需要DN登录。对于retrive,DN首先搜索用户uid

$search = ldap_search($ldapconn, $baseDn, $filter, $attributes);

if ($search) {
    $entries = ldap_get_entries($ldapconn, 'uid=' . $ldaprdn);// Here $ldaprdn is the email
    if (is_array($entries)) {
        $ldaprdn = $entries[0]['dn']; // Get the DN of the user
    }
}

$ldapbind = ldap_bind($ldapconn, $ldaprdn, $ldappass);

// ....

注意:您应该转义$ldaprdn以避免LDAP注入攻击。

答案 1 :(得分:0)

好的,经过大量调查后,我使用ldap_errno()ldap_error()打开了错误信息,发现它带来了错误'强(呃)身份验证所需'已经发现了两种可能的解决方案;

调整组策略设置

  • 协商签名(网络安全:LDAP客户端签名要求)
  • 无签名要求(域控制器:LDAP服务器签名要求)

  • 结果:管理成功绑定,当我输错用户名或密码时,它会抛出“无效凭据”。正如所料。

启用LDAP over SSL(LDAPS)