我的代码是:
$user = 'test';
$password = 'testpass';
$host = '10.1.1.1';
$port = 389;
$basedn = 'dc=ci,dc=mycompany,dc=com';
$group = 'Users';
$ldaprdn = 'uid=test,dc=ci,dc=mycompany,dc=com';
$ad = ldap_connect("ldap://$host", $port);
if ($ad) {
echo "Connected" . "<br/>";
} else {
echo ldap_error($ad) . "<br/>";
}
ldap_set_option($ad, LDAP_OPT_PROTOCOL_VERSION, 3);
ldap_set_option($ad, LDAP_OPT_REFERRALS, 0);
// $ldapBind = ldap_bind($ad, "{$user}@{$domain}", $password); // 1.
// $ldapBind = ldap_bind($ad, $user, $password); // 2.
$ldapBind = ldap_bind($ad, $ldaprdn, $password); // 3.
// $ldapBind = ldap_bind($ad, null, null); // 4.
if ($ldapBind) {
echo "Binded" . "<br/>";
} else {
echo ldap_error($ad) . "<br/>";
}
现在我使用注释行“3”,获取:
Connected
Invalid credentials
如果使用注释行“1”或“2”,请获取:
Connected
Invalid DN syntax
如果使用注释行“4”(这是匿名),请获取:
Connected
Binded
这是在Ubuntu 12下开发的。
为什么我从评论专栏“3”获得无效的凭据错误?如何正确绑定身份验证? 提前致谢!
答案 0 :(得分:4)
ldap_bind
功能似乎需要 DN ,而不是 RDN ,无论文档说什么。如果是这种情况,那么:
{$user}@{$domain}
格式不正确的DN,因此:Invalid DN syntax
test
格式不正确的DN,因此:Invalid DN syntax
有关 DN 格式的字符串表示形式的信息,请参阅RFC4514
据我所知,3号是提供的四个中唯一正确的一个。 Directory Server在BIND响应中指出,它无法验证提供的密码testpass
是否与存储在其数据库中的密码相匹配。在这种情况下,我建议使用ldapsearch
等已知的好工具检查密码。
ldapsearch -h hostname -p port \
-D 'uid=test,dc=ci,dc=mycompany,dc=com' \
-w 'testpass' -s base '(&)' 1.1
使用密码ldapsearch
将testpass
目录绑定到目录'uid = test,dc = ci,dc = mycompany,dc = com'并检索 DN uid=test
条目。如果失败并显示“无效凭据”错误,则存在以下可能性:
testpass
不是正确的密码uid=test
条目不存在。上面的要点解释了这将导致“无效凭据”。没有必要告诉攻击者一个条目不存在 - 这将为攻击者提供额外的信息(他只有一个DN可以尝试)。为了使用正确的术语:
$ldaprdn
不是RDN,它是DN。 RDN是DN的组成部分答案 1 :(得分:0)
我发现问题,$ ldaprdn ='uid = test,dc = ci,dc = mycompany,dc = com'与LDAP服务器上的不一样,更改后运行良好。
答案 2 :(得分:0)
@ Annamalai.Somasundaram,
DN应该传递类似 cn = test,ou = Users,dc = ci,dc = mycompany,dc = com
可以在特定的LDAP服务器上找到正确的拼写