通过 Active Directory 使用 LDAP 在 PHP 中进行身份验证

2022-08-30 07:21:59

我正在寻找一种使用PHP通过LDAP对用户进行身份验证的方法(Active Directory是提供商)。理想情况下,它应该能够在IIS 7上运行(adLDAP在Apache上做到这一点)。有人做过类似的事情,取得了成功吗?

  • 编辑:我更喜欢一个库/类,其中包含准备就绪的代码...当有人已经发明轮子时,发明轮子是愚蠢的。

答案 1

导入整个库似乎效率低下,因为您所需要的只是两行代码...

$ldap = ldap_connect("ldap.example.com");
if ($bind = ldap_bind($ldap, $_POST['username'], $_POST['password'])) {
  // log them in!
} else {
  // error message
}

答案 2

您可能会认为,在Active Directory中简单地对用户进行身份验证将是一个非常简单的过程,使用PHP中的LDAP而无需库。但是有很多事情可以很快使它复杂化:

  • 您必须验证输入。否则,空用户名/密码将传递。
  • 您应确保在绑定时正确编码用户名/密码。
  • 您应该使用 TLS 加密连接。
  • 使用单独的 LDAP 服务器进行冗余,以防其中一台服务器出现故障。
  • 如果身份验证失败,则会收到信息性错误消息。

在大多数情况下,使用支持上述内容的LDAP库实际上更容易。我最终滚动了自己的库,它处理上述所有要点:LdapTools(好吧,不仅仅是用于身份验证,它可以做更多的事情)。它可以像下面这样使用:

use LdapTools\Configuration;
use LdapTools\DomainConfiguration;
use LdapTools\LdapManager;

$domain = (new DomainConfiguration('example.com'))
    ->setUsername('username') # A separate AD service account used by your app
    ->setPassword('password')
    ->setServers(['dc1', 'dc2', 'dc3'])
    ->setUseTls(true);
$config = new Configuration($domain);
$ldap = new LdapManager($config);

if (!$ldap->authenticate($username, $password, $message)) {
    echo "Error: $message";
} else {
    // Do something...
}

上面的身份验证调用将:

  • 验证用户名或密码是否均不为空。
  • 确保用户名/密码已正确编码(默认为 UTF-8)
  • 尝试使用备用 LDAP 服务器,以防其中一台服务器出现故障。
  • 使用 TLS 加密身份验证请求。
  • 如果失败,请提供其他信息(即锁定/禁用帐户等)

还有其他库可以做到这一点(例如Adldap2)。但是,我觉得有必要提供一些额外的信息,因为投票最多的答案实际上是一种安全风险,无需完成输入验证并且不使用TLS。


推荐