我在LDAP身份验证中遇到了一个奇怪的行为,我需要这个用他们的AD凭据来验证用户,这就是我所拥有的:
session_start();
$adServer = "MY IP";
$ldapconn = ldap_connect($adServer) or $this->msg = "Could not connect to LDAP server.";
$ldaprdn = "DOMAIN\\" . $_POST["username"];
$ldapbind = ldap_bind($ldapconn, $ldaprdn, $_POST["password"]);
if ($ldapbind) {
//$msg = "Successfully Authenticated";
$_SESSION['loggedin'] = 1;
$_SESSION['username'] = $username;
header("Location: ../main.php");
} else {
header("Location: ../index.php?login_failed=1");
}
这是我得到的不同行为:
我发现这很难集中,如果没有使用密码字段,所有用户都会被验证。但是,如果我使用密码字段,它只会使用正确的凭据对用户进行身份验证..
我在这里做错了什么,还是应该开始唠叨IT人员?
答案 0 :(得分:8)
在做了一些研究后,我得出结论,我们使用的LDAP服务器允许匿名绑定。
更多信息: https://issues.jfrog.org/jira/browse/RTFACT-3378
警告:尝试使用空密码绑定总是成功 因为LDAP协议认为这是一个“匿名”绑定, 即使指定了用户名。始终检查空白密码 在绑定之前。
为了解决这个问题,我现在检查PHP中的密码输入字段:
if (strlen(trim($user_pass)) == 0) {
//login failed
} else {
$ldaprdn = "DOMAIN\\" . $_POST["username"];
$ldapbind = ldap_bind($ldapconn, $ldaprdn, $_POST["password"]);
}
空密码输入(或空格)将始终返回登录失败。
答案 1 :(得分:7)
使用'简单'BIND身份验证方法,有四种可能性:
3d是唯一进行身份验证的人。正确配置的LDAP目录服务器将拒绝其他3种可能性,因为与问题所述相反,不会进行身份验证。 API不抛出异常或返回true
的方法并不表示是否进行了身份验证。 BIND结果包含一个整数结果代码,表示身份验证是否成功。
答案 2 :(得分:2)
在唠叨IT人员之前,请检查行中是否传递了值
$ ldapbind = ldap_bind($ ldapconn,$ ldaprdn,$ _POST [“password”]);
是的,你可能已经检查了这个,但是做了
的var_dump($ ldaprdn); 的var_dump($ _ POST [ “密码”]);
并查看数据是否准确。
手动输入数据
$ ldapbind = ldap_bind($ ldapconn,“username”,“password”);
同时检查您是否必须提供整个DN,例如CN = Username,DC = xxx,DC = com作为用户名。
有时你必须提供诸如“用户名”之类的名称,而不是“user.name”,因为这是它的存储方式。
如果这一切都失败了,你可以去吃IT人员的负责人:-P