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


104

我正在寻找一种通过PHP(通过Active Directory作为提供者)通过LDAP验证用户身份的方法。理想情况下,它应该能够在IIS 7上运行(adLDAP在Apache上运行)。有谁做过类似的事情,并且成功了?

  • 编辑:我更喜欢一个库/类,其中的代码已经准备就绪...如果有人已经发明了轮子,那就太愚蠢了。

我认为drupal具有供您使用的模块
redben

Answers:


167

当您只需要两行代码时,导入整个库似乎效率很低。

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

43
如果提供的密码为空,则某些AD安装将成功绑定。当心这个!在尝试进行身份验证之前,您可能需要确保非空密码。
diolemo

@diolemo有什么方法可以在不检查密码是否为空的情况下阻止它吗?
Naftali,也就是Neal,2013年

@Neal您可能可以ldap_set_option用来使其表现不同。也许设置协议版本?您将不得不尝试。我个人建议您还是为了确保安全而检查空密码。
diolemo


对匿名编辑者:不,据我所知,这里不需要像输入处理一样ldap_bind进行输入卫生处理,特殊字符也不是问题。
ceejayoz 2014年

14

您会认为,简单地在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...
}

上面的authenticate调用将:

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

也有其他库可以做到这一点(例如Adldap2)。但是,我感到被迫提供足够的信息,因为投票最多的答案实际上是一个安全风险,要依靠它来完成输入验证而不使用TLS。


1
对于LDAP连接,不建议使用TLS,而推荐使用StartTLS:openldap.org/faq/data/cache/605.html
zenlord

2
@zenlord不赞成使用ldaps://连接格式。在我的示例中,当您指定setUseTls(true)它使用ldap://格式时,然后使用发出StartTLS ldap_start_tls($connection)。因此TLS本身并没有被弃用,只是使用进行了连接ldaps://(实际上是通过完全不同的端口连接到LDAP)。
ChadSikorra




By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.