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

时间:2008-10-05 04:59:12

标签: php authentication active-directory ldap

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

  • 编辑:我更喜欢一个库/类,代码已经准备好了......当有人已经这样做时发明轮子真是太傻了。

6 个答案:

答案 0 :(得分:159)

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

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

答案 1 :(得分: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...
}

上面的身份验证呼叫将:

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

还有其他库也可以这样做(例如Adldap2)。但是,我觉得有必要提供一些额外的信息,因为最高投票的答案实际上是一个安全风险依赖于没有完成输入验证而不使用TLS。

答案 2 :(得分:11)

我只是将用户凭据传递给ldap_bind()。

http://php.net/manual/en/function.ldap-bind.php

如果帐户可以绑定到LDAP,则该帐户有效;如果它不能,那就不是。如果您所做的只是身份验证(而不是帐户管理),我认为不需要库。

答案 3 :(得分:9)

我喜欢Zend_Ldap类,您可以在项目中仅使用此类,而不使用Zend Framework。

答案 4 :(得分:6)

PHP有库:http://ca.php.net/ldap

PEAR还有许多套餐:http://pear.php.net/search.php?q=ldap&in=packages&x=0&y=0

我没有使用过,但我曾经在某个时刻,他们似乎应该工作。

答案 5 :(得分:5)

对于那些寻找完整示例的人,请查看http://www.exchangecore.com/blog/how-use-ldap-active-directory-authentication-php/

我已经测试了从Windows Server 2003 Web服务器(IIS6)和运行IIS 8的Windows Server 2012企业连接到Windows Server 2003和Windows Server 2008 R2域控制器。