我试图通过一个简单的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。
答案 0 :(得分:0)
您代码中的$ ldap_dn是否正确匹配AD中的DN? 如果您是AD的管理员,则可以通过在AD的DOS提示符下执行dsquery命令来确认它。
例如
dsquery user -name pecal
或者您可以使用格式
$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