将PHP登录到Active Directory失败

时间:2019-04-29 09:42:35

标签: php active-directory ldap

我试图通过一个简单的PHP代码来验证用户的身份,但是我总是收到相同的错误“无效凭据”。

$ldap_dn = "uid=".$_POST["username"].",DC=xxx,DC=xxx,DC=xxx,DC=xxx,DC=xxx";
$ldap_password = $_POST["password"];

$ldap_con =   ldap_connect("xxx", 389);
ldap_set_option($ldap_con, LDAP_OPT_PROTOCOL_VERSION,3);

//check connection
if ($ldap_con === FALSE) {
    die("<p> Couldn't connect to LDAP service </p>");
    } else {
        echo "<p> connessione avvenuta con successo </p>";
}

// check authentication
if(@ldap_bind($ldap_con, $ldap_dn, $ldap_password)){
    echo "Autenticato";
}else{
    echo "Autenticazione Fallita <br>";
    echo ldap_error($ldap_con);
}

PHP代码在已登录公司域的PC W7pro的XAMP上运行。

我已经从执行测试的同一台机器上获得了AD地址;对于检索DN,我使用了“ Softerra LDAP浏览器”程序,但实际上我不确定该参数。

当用户登录域时,用户名使用姓氏的三个字母,后跟两个姓氏,例如名称= Alfred /姓= Pecora用户名= pecal。

2 个答案:

答案 0 :(得分:0)

您代码中的$ ldap_dn是否正确匹配AD中的DN? 如果您是AD的管理员,则可以通过在AD的DOS提示符下执行dsquery命令来确认它。

例如

dsquery user -name pecal

或者您可以使用格式 @ 代替DN格式:

$ldap_dn = $_POST["username"]."@example.com";

答案 1 :(得分:0)

我运行了一个新测试:

$adServer = "xxx";

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


$ldapRdnLogin = "CN=MyName MySurname,OU=CED,OU=Users,DC=intranet,DC=xxx,DC=xxx,DC=xx,DC=it";
$ldapRdn = "OU=Users,DC=intranet,DC=xxx,DC=xxx,DC=xx,DC=it";


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

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


if ($bind) {
    $filter="(sAMAccountName=$username)";
    $result = ldap_search($ldap,$ldapRdn,$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 = ldap_error($ldap);
    echo $msg;
}

在上面的示例中,绑定“ MyName MySurname” \ DN 有效,我可以执行搜索。

我认为问题在于找到与sAMAccountName绑定的正确DN