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


Cleaner way of authenticating with active directory?

在我工作的地方,我们使用匿名目录访问,因为一些smtp服务器需要它。我不知道具体情况。对于我正在从事的一个项目,我想使用活动目录登录。我遇到的问题,我无法检查 ldap == 是否为真,因为它将/总是/等于真。另外,我正在执行整个登录并在一个页面上显示内容,而无需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;}

基本上是用假密码硬编码,然后等待登录表单传入真实的密码。这个系统有效,但我想知道是否有一种更清洁/更简单/更快的方法来做到这一点。

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

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

这就是"身份验证"与 LDAP 一起工作的方式。您或多或少地将其封装在代码片段中,尽管您没有检查可能随 BIND 响应一起到达的响应控件。

参见

  • LDAP:掌握搜索过滤器
  • LDAP:搜索最佳做法
  • LDAP:编程实践
这个问题

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