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

我正在寻找一种方法来通过LDAP(使用Active Directory作为提供者)对LDAP进行身份validation。 理想情况下,它应该能够在IIS 7上运行( adLDAP在Apache上运行)。 任何人都做过类似的事情,成功了吗?

  • 编辑:我更喜欢一个图书馆/类的代码准备去…当有人已经这样做了发明轮子是愚蠢的。

当你所需要的基本上是两行代码时,导入整个库似乎效率低下。

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

我只需将用户凭据传递给ldap_bind()即可。

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

如果帐户可以绑定到LDAP,则是有效的; 如果不能,那不是。 如果你所做的只是authentication(不是账户pipe理),我不认为需要一个库。

你会认为在Active Directory中validation用户是一个相当简单的过程,在PHP中使用LDAP而不需要库。 但是有很多事情可能会使其复杂化很快:

  • 您必须validationinput。 一个空的用户名/密码会通过其他方式。
  • 绑定时应确保用户名/密码正确编码。
  • 您应该使用TLSencryption连接。
  • 万一发生故障,使用单独的LDAP服务器进行冗余。
  • 如果身份validation失败,请获取信息错误消息。

在大多数情况下,使用支持上述内容的LDAP库实际上更简单。 我最终结束了滚动我自己的库处理所有上述点: LdapTools (嗯,不只是为了authentication,它可以做更多)。 它可以像下面这样使用:

 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... } 

上面的validation电话会:

  • validation用户名或密码是否为空。
  • 确保用户名/密码被正确编码(默认为UTF-8)
  • 如果遇到问题,请尝试备用的LDAP服务器。
  • 使用TLSencryption身份validation请求。
  • 提供额外的信息,如果失败(即locking/禁用帐户等)

还有其他的库也可以做到这一点(如Adldap2)。 然而,我觉得有必要提供一些额外的信息,因为最有价值的答案实际上是一个安全风险,依靠没有inputvalidation,而不是使用TLS。

我喜欢Zend_Ldap类,你可以在你的项目中只使用这个类,没有Zend Framework。

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

PEAR也有一些软件包: http : //pear.php.net/search.php? q=ldap&in=packages& x=0&y=0

我也没有用过,但我曾经有过一次,他们似乎应该工作。

对于那些正在寻找一个完整的例子检查http://www.exchangecore.com/blog/how-use-ldap-active-directory-authentication-php/

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