我在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");
}
这是我得到的不同行为:
-
无用户名/无密码=经过身份验证(BAD)
-
用户名/无密码=已验证(BAD)
-
用户名/密码不正确(两个字段都已给出)=未经过身份验证
-
正确的用户名/密码(两个字段都已给出)=已验证
我发现这很难集中,如果没有使用密码字段,所有用户都会被验证 . 但是,如果我使用密码字段,它只会使用正确的凭据对用户进行身份验证 .
我在这里做错了什么,还是应该开始唠叨IT人员?
3 回答
在做了一些研究之后,我得出结论,我们使用的LDAP服务器允许匿名绑定 .
更多信息:https://issues.jfrog.org/jira/browse/RTFACT-3378
为了解决这个问题,我现在检查PHP中的密码输入字段:
空密码输入(或空格)将始终返回登录失败 .
使用“简单”BIND身份验证方法,有四种可能性:
null DN,空密码(匿名):不进行身份验证,因此此会话和授权状态不安全
DN,空密码(未经身份验证):不进行身份验证,因此此会话和授权状态不安全
DN和密码:进行身份验证,成功或失败
null DN,密码:不进行身份验证,因此此会话和授权状态不安全
3d是唯一进行身份验证的人 . 正确配置的LDAP目录服务器将拒绝其他3种可能性,因为与问题所述相反,不会进行身份验证 . API不抛出异常或返回
true
的方法并不表示是否进行了身份验证 . BIND结果包含一个整数结果代码,表示身份验证是否成功 .另见
LDAP: authentication best practices
LDAP: programming practices
在您唠叨IT人员之前,请检查该行中是否传递了值
是的,你可能已经检查了这个,但做了一个
并查看数据是否准确 .
手动输入数据
还要检查是否必须提供整个DN,例如CN = Username,DC = xxx,DC = com作为用户名 .
有时您还必须提供诸如“用户名”之类的名称,而不是“user.name”,因为这是它的存储方式 .
如果这一切都失败了,你可以去吃IT人员:-P