我已经在Windows Server 2012上设置了Active Directory和ADLDAP。 我正在尝试一个简单的ldap_bind但仍然有一个"无效凭据"错误吐回给我。
在我的 AD 用户和组屏幕中,我可以清楚地看到我创建的域以及 OU(组织单位(和其中的用户。ASDI 编辑清楚地告诉我该用户的 DN:
CN=Bob Smith,OU=Accounting,DC=mydomain,DC=net
此外,BaseDN 在 ASDI 编辑中清楚地告诉我,因为它高于 OU 组"会计"——
DC=mydomain,DC=net
现在进入我的脚本 - 它不会抛出 LDAP 连接错误,仅在绑定时抛出,并具有恒定的无效凭据:
$connectionLDAP = "LDAP://localhost:54126";
$basedn = 'DC=mydomain,DC=net';
$ldap = ldap_connect($connectionLDAP) or die("Could not connect to LDAP server.");
$username = $post['username'];
$password = $post['password'];
$usernameForBind = "CN=".$username.",OU=Accounting,".$basedn;
ldap_set_option($ldap, LDAP_OPT_PROTOCOL_VERSION, 3);
ldap_set_option($ldap, LDAP_OPT_REFERRALS, 0);
$bind = ldap_bind($ldap, $usernameForBind, $password);
这引发了以下警告,当然我的脚本到此结束,因为没有找到与用户名和密码的正匹配:
Warning: ldap_bind(): Unable to bind to server: Invalid credentials in C:'....'login.php on line 41
下面的错误回声产生这个:
echo(ldap_error($ldap)."<br>");
echo(ldap_errno($ldap)."<br>");
Invalid credentials
49
我已经尝试了DN,用户名,电子邮件地址,mydomain''用户名的所有组合,而没有其余的DN信息,我能想到的一切......但对于我的生活来说,这并不需要,不幸的是,谷歌+堆栈搜索目前并没有帮助我克服这一点。
感谢您的任何帮助。
您正在使用Windows上的Active Directory,因此请将您的代码更改为以下它将起作用。因为AD需要@domain_name绑定函数中的用户名后缀。
$connectionLDAP = "ldap://localhost";
$basedn = '@mydomain.net';
$ldap = @ldap_connect($connectionLDAP, 54126) or die("Could not connect to LDAP server.");
$username = $post['username'];
$password = $post['password'];
$usernameForBind = $username.$basedn;
@ldap_set_option($ldap, LDAP_OPT_PROTOCOL_VERSION, 3);
@ldap_set_option($ldap, LDAP_OPT_REFERRALS, 0);
$bind = @ldap_bind($ldap, $usernameForBind, $password);
我已经多次测试过这样的场景,它适用于 AD。
另外,请确保您的AD服务器在代码中使用的相同端口上运行,即。54126.