You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

PHP LDAP登录有效凭证始终返回无效账号/密码,求助解决

LDAP登录验证失败排查与解决办法

问题描述

使用以下PHP代码实现LDAP登录,已确认输入的凭证有效,但登录时始终提示"Invalid email address / password":

if(isset($_POST['username']) && isset($_POST['password'])){

    $adServer = "ldap://domaincontroller.mydomain.com";

    $ldap = ldap_connect($adServer);
    $username = $_POST['username'];
    $password = $_POST['password'];

    $ldaprdn = 'mydomain' . "\\" . $username;

    ldap_set_option($ldap, LDAP_OPT_PROTOCOL_VERSION, 3);
    ldap_set_option($ldap, LDAP_OPT_REFERRALS, 0);

    $bind = @ldap_bind($ldap, $ldaprdn, $password);

    if ($bind) {
        $filter="(sAMAccountName=$username)";
        $result = ldap_search($ldap,"dc=MYDOMAIN,dc=COM",$filter);
        ldap_sort($ldap,$result,"sn");
        $info = ldap_get_entries($ldap, $result);
        for ($i=0; $i<$info["count"]; $i++)
        {
            if($info['count'] > 1)
                break;
            echo "<p>You are accessing <strong> ". $info[$i]["sn"][0] .", " . $info[$i]["givenname"][0] ."</strong><br /> (" . $info[$i]["samaccountname"][0] .")</p>\n";
            echo '<pre>';
            var_dump($info);
            echo '</pre>';
            $userDn = $info[$i]["distinguishedname"][0]; 
        }
        @ldap_close($ldap);
    } else {
        $msg = "Invalid email address / password";
        echo $msg;
    }

}else{
?>
    <form action="#" method="POST">
        <label for="username">Username: </label><input id="username" type="text" name="username" /> 
        <label for="password">Password: </label><input id="password" type="password" name="password" />        <input type="submit" name="submit" value="Submit" />
    </form>
<?php } ?>

排查步骤与解决办法

1. 移除错误抑制符,查看真实错误信息

代码中@ldap_bind的@会屏蔽所有LDAP绑定相关的错误,导致无法定位问题。修改代码,去掉@并添加错误输出:

$bind = ldap_bind($ldap, $ldaprdn, $password);
if (!$bind) {
    die('LDAP绑定失败: ' . ldap_error($ldap));
}

运行后就能看到具体错误(比如连接超时、凭证格式错误、服务器不可达等)。

2. 验证LDAP服务器连接有效性

先确认ldap_connect是否成功建立连接,在ldap_connect后添加:

if (!$ldap) {
    die('无法连接到LDAP服务器: ' . ldap_error($ldap));
}

如果连接失败,检查:

  • 服务器地址是否正确(domaincontroller.mydomain.com是否能解析到实际AD服务器)
  • 端口是否正确:默认LDAP端口是389,若使用SSL加密则是636,需改为ldaps://domaincontroller.mydomain.com:636
  • 服务器防火墙是否允许当前主机访问LDAP端口

3. 调整绑定的用户格式

AD支持两种绑定格式,若NETBIOS格式(mydomain\username)失败,尝试使用UPN格式(username@mydomain.com):

$ldaprdn = $username . '@mydomain.com';

4. 确认Base DN的正确性

代码中ldap_search的第三个参数dc=MYDOMAIN,dc=COM必须与AD域的实际结构完全匹配。比如你的域是mydomain.local,则需改为dc=mydomain,dc=local。可以通过AD管理工具查看域的完整DN。

5. 检查PHP LDAP扩展状态

确认PHP环境已安装并启用LDAP扩展:

  • 执行php -m查看是否有ldap模块
  • 或在网页中输出phpinfo(),搜索LDAP相关配置,确保扩展已启用

6. 排查凭证输入问题

  • 确认用户名是否包含大小写:AD默认不区分大小写,但部分环境可能有特殊配置
  • 检查密码是否包含特殊字符(比如\、@等),是否在POST传输中被转义,可通过var_dump($_POST['password'])验证

修改后的示例代码

if(isset($_POST['username']) && isset($_POST['password'])){
    $adServer = "ldap://domaincontroller.mydomain.com";
    $ldap = ldap_connect($adServer);
    
    if (!$ldap) {
        die('无法连接到LDAP服务器: ' . ldap_error($ldap));
    }

    $username = $_POST['username'];
    $password = $_POST['password'];

    // 尝试UPN格式绑定
    $ldaprdn = $username . '@mydomain.com';
    // 或保留NETBIOS格式:$ldaprdn = 'mydomain' . "\\" . $username;

    ldap_set_option($ldap, LDAP_OPT_PROTOCOL_VERSION, 3);
    ldap_set_option($ldap, LDAP_OPT_REFERRALS, 0);

    $bind = ldap_bind($ldap, $ldaprdn, $password);

    if ($bind) {
        $filter="(sAMAccountName=$username)";
        // 替换为实际的Base DN
        $result = ldap_search($ldap,"dc=mydomain,dc=com",$filter);
        ldap_sort($ldap,$result,"sn");
        $info = ldap_get_entries($ldap, $result);
        
        if($info["count"] == 0){
            echo "未找到用户信息";
        } else {
            for ($i=0; $i<$info["count"]; $i++)
            {
                echo "<p>登录成功:<strong> ". $info[$i]["sn"][0] .", " . $info[$i]["givenname"][0] ."</strong><br /> (" . $info[$i]["samaccountname"][0] .")</p>\n";
                echo '<pre>';
                var_dump($info);
                echo '</pre>';
                $userDn = $info[$i]["distinguishedname"][0]; 
            }
        }
        ldap_close($ldap);
    } else {
        echo "登录失败: " . ldap_error($ldap);
    }

}else{
?>
    <form action="#" method="POST">
        <label for="username">Username: </label><input id="username" type="text" name="username" /> 
        <label for="password">Password: </label><input id="password" type="password" name="password" />
        <input type="submit" name="submit" value="Submit" />
    </form>
<?php } ?>

内容的提问来源于stack exchange,提问作者Hdhdhdhdhdhdjfjfj

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.25 08:47:08