我正在尝试通过LDAP(活动目录)验证用户。ldap_compare
显示Warning: ldap_compare(): Compare: Operations error in /mehr/public/lab/lab.php on line 26
警告并返回-1
。这个警告对我来说很模糊。有什么问题吗?
<?php
$ldap = ldap_connect("179.33.2.200");
ldap_set_option($ldap, LDAP_OPT_PROTOCOL_VERSION, 3); // Recommended for AD
ldap_set_option($ldap, LDAP_OPT_REFERRALS, 0);
$bind = ldap_bind($ldap, 'admin', '123456');
$bdn = 'DC=active,DC=local';
$r = ldap_compare($ldap, $bdn, 'userpassword', '123456');
$r = ldap_compare($ldap, $bdn, 'ou', 'bar'); // or evern
<标题> Upate: 使用@Arnold提示,我调用ldap_compare如下:
ldap_compare($ldap, $dn, 'ou', mb_convert_encoding('bar','utf16'))
现在,我没有得到"操作错误"(使用utf-16le
导致相同的错误),但现在它返回所有属性/值对的false
。
您不能在活动目录中以这种方式比较密码。
首先,密码不是以明文形式存储在数据库中——它们是散列的,此外它们是UTF-16le编码的。
如果您只需要验证用户是否是他们声称的那个人,只需将绑定为该用户来验证他们:
// ... preparation code
if (ldap_bind($ldap, $userSuppliedName, $userSuppliedPassword)) {
// credentials are valid
} else {
// credentials are invalid
}
此方法负责 Active Directory中可用的所有身份验证规则,包括但不限于登录时间、工作站限制、密码过期、无效登录尝试等。简单地比较密码并不能告诉您上述任何信息。