PHP对接Active Directory LDAPS绑定返回Invalid Credential问题咨询
问题解答
实现思路正确性判断
你提出的实现思路是正确的,属于Active Directory对接的标准流程:
- 先使用拥有查询权限的管理员凭据完成LDAPS绑定
- 再用用户提交的账号在AD中搜索到对应用户的完整可分辨名称(DN)
- 最后使用搜索到的用户DN和用户提交的密码做绑定校验,即可完成用户身份验证
相比你直接拼接用户DN的写法,这种先搜索再校验的方式兼容性更强,不会因为用户所属OU变化导致校验失败。
绑定失败的排错步骤
你现在不管用普通用户还是管理员都绑定失败,主要有以下几个常见原因,按优先级排查:
管理员绑定DN填写错误
你测试用的管理员DN只写了CN=sysadmin,属于不完整的可分辨名称,必须补全全路径,和你普通用户的DN规则一致,比如sysadmin如果放在默认Users容器下,完整DN应该是类似CN=sysadmin,CN=Users,DC=ultimate,DC=local,你可以在AD服务器上查看sysadmin账号的属性获取完整DN。错误被抑制无法排查根因
你代码里用了@符抑制了ldap_bind的所有报错,无法看到真实错误原因,先删除@,并在else分支加入错误打印代码,就能拿到具体报错信息:
else { echo "绑定失败,错误原因:" . ldap_error($ldap_con); }
- LDAPS证书校验失败
PHP默认会校验LDAPS服务端的SSL证书,如果你的AD用的是自签名证书,或者PHP服务器没有信任AD的根证书,也会导致绑定失败。可以先添加配置跳过证书校验做测试(生产环境请把AD根证书导入PHP的信任证书库,不要长期跳过校验):
$ldap_con = ldap_connect("ldaps://192.168.124.40:636"); ldap_set_option($ldap_con, LDAP_OPT_PROTOCOL_VERSION, 3); // 新增以下两行跳过证书校验 ldap_set_option($ldap_con, LDAP_OPT_REFERRALS, 0); ldap_set_option($ldap_con, LDAP_OPT_X_TLS_REQUIRE_CERT, LDAP_OPT_X_TLS_NEVER);
- 语法错误
你第二段测试代码里的echo "King"后面缺少分号,会导致PHP语法报错,先补上分号再测试。
内容的提问来源于stack exchange,提问作者Etzi138
相关产品推荐
相关产品推荐

