PHP连接Active Directory认证失败问题求助
解决LDAP绑定提示"Invalid credentials"的问题
你遇到的这个问题在AD LDAP绑定场景里挺常见的——虽然LDAP连接能成功建立,但身份验证一直失败。结合你的环境(已加入域的Win7 XAMPP)和代码细节,我给你几个按优先级排序的排查修复方向:
1. 先搞定DN的问题(最可能的元凶)
你自己也对DN参数存疑,这确实是AD绑定失败的高频原因:
- AD里用户的DN通常需要包含所在的OU(组织单元),不是直接跟在DC后面。比如如果你的用户在
UsersOU下,正确的DN应该是:$ldap_dn = "CN=Alfred Pecora,OU=Users,DC=xxx,DC=xxx,DC=xxx,DC=xxx,DC=xxx"; - AD里uid字段基本不用于登录,你用的
pecal这类登录名对应的是sAMAccountName属性。如果想用登录名拼接DN,应该用sAMAccountName而非uid;或者更简单的方式——直接用域\用户名格式作为绑定DN,这种方式比拼接完整DN靠谱得多:$ldap_dn = "YOUR_DOMAIN\\pecal"; // 注意反斜杠要转义,用单引号可写为'YOUR_DOMAIN\pecal'
2. 调整LDAP连接的关键选项
AD LDAP默认的引用跟随经常会搞砸绑定流程,你需要在设置协议版本后加上这一行:
ldap_set_option($ldap_con, LDAP_OPT_REFERRALS, 0);
调整后的完整连接配置部分:
$ldap_con = ldap_connect("xxx", 389); ldap_set_option($ldap_con, LDAP_OPT_PROTOCOL_VERSION, 3); ldap_set_option($ldap_con, LDAP_OPT_REFERRALS, 0); // 必须添加这一行
3. 确认用户名和密码没踩基础坑
别嫌麻烦,先排除最基础的错误:
- 去AD用户属性的「账户」标签确认,
pecal确实是该用户的sAMAccountName(有时候显示名和登录名并不一致) - 先手动硬编码密码测试,比如把
$ldap_password改成用户的真实密码,排除POST传递时的字符转义问题(比如密码里有\、引号这类特殊字符)
4. 试试NTLM绑定(适合域内机器)
因为你的机器已经加入公司域,还可以用NTLM身份验证模式,这种方式不需要纠结DN格式,代码示例:
$ldap_con = ldap_connect("xxx", 389); ldap_set_option($ldap_con, LDAP_OPT_PROTOCOL_VERSION, 3); ldap_set_option($ldap_con, LDAP_OPT_REFERRALS, 0); // 开启NTLM认证模式 ldap_set_option($ldap_con, LDAP_OPT_AUTH_MECH, "NTLM"); // 用域\用户名+密码绑定 if(ldap_bind($ldap_con, "YOUR_DOMAIN\\{$_POST['username']}", $_POST['password'])){ echo "Autenticato"; }else{ echo "Autenticazione Fallita <br>"; echo ldap_error($ldap_con); }
建议你先尝试第1和第2点的组合——用域\用户名格式绑定+关闭引用,这两个调整解决了我遇到的大部分AD LDAP绑定问题。
内容的提问来源于stack exchange,提问作者Max79
相关产品推荐
相关产品推荐

