使用活动目录进行身份验证的更清洁方式?

时间:2013-10-30 16:55:36

标签: php ldap

在我工作的地方,我们使用匿名目录访问,因为某些smtp服务器需要它。我不知道具体细节。对于我正在进行的项目,我想使用活动目录登录。问题我遇到了,我无法检查ldap ==是否因为它将/ always / equal为true。此外,我正在进行整个登录并在没有javascript的情况下在一个页面上显示内容。

这就是我所做的:

$adServer = 'ipaddress';
$ldapconn = ldap_connect($adServer)
or $this->msg = "Could not connect to LDAP server.";
//Begin magic to compensate for anonymous directory access while still locking out anonymous users
if($_POST["password"] == null)
{
$password = "invalid";
}
else $password = $_POST["password"];
$ldaprdn = "domain\\" . $_POST["username"];
$ldapbind = ldap_bind($ldapconn, $ldaprdn, $password);

if($ldapbind) {
$loggedin = true;
}
elseif(isset($_POST["password"]) && !$_POST["password"] == null) {
$msg = "Incorrect username or password";
$loggedin = false;
}
else {$loggedin = false;}

基本上用虚假密码进行硬编码并等待登录表单传入真实密码。这个系统有效,但我想知道是否有更干净/更容易/更快的方法。

2 个答案:

答案 0 :(得分:0)

此问题与ldap无关,但是更为通用的问题如下:如何在PHP中进行表单验证?

if (isset($_POST["password"]) === false) {
    throw new Exception("Missing input");
}
if (is_string($_POST["password"]) === false) {
    throw new Exception("Bad input");
}
// now you now password exists, and it's a string so you can pass it to ldap

答案 1 :(得分:0)

当客户端连接到LDAP目录服务器时,该连接具有未经身份验证的授权状态。 LDAP客户端可以使用BIND请求来请求服务器将连接的授权状态更改为与BIND请求中的信息关联的状态(在Simple BIND请求中,唯一的信息是DN和密码)。一旦成功更改了连接的授权状态,就会使用该授权状态对该连接进行进一步操作,直到:

  • 新的BIND请求到达连接
  • 客户端或服务器终止连接。

这就是“身份验证”与LDAP一起使用的方式。您已经或多或少地在代码片段中封装了这些内容,但是您没有检查可能已经通过BIND响应到达的响应控件。

另见