代码之家  ›  专栏  ›  技术社区  ›  DV.

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

  •  97
  • DV.  · 技术社区  · 16 年前

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

    • 编辑:我更喜欢一个带有代码的库/类。。。如果有人已经发明了轮子,那就太傻了。
    6 回复  |  直到 16 年前
        1
  •  176
  •   ceejayoz    11 年前

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

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

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

    • 您必须验证输入。否则将传递空用户名/密码。
    • 绑定时应确保用户名/密码正确编码。
    • 使用单独的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服务器关闭,请尝试另一个LDAP服务器。
    • 使用TLS加密身份验证请求。

    还有其他库也可以这样做(如Adldap2)。然而,我觉得有必要提供一些额外的信息,因为投票最多的答案实际上是一种安全风险,在没有输入验证和不使用TLS的情况下依赖它。

        3
  •  12
  •   Scott Reynen    16 年前

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

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

        4
  •  9
  •   1234567    7 年前

    我喜欢这个 Zend_Ldap 类,则在项目中只能使用该类,而不使用Zend框架。

        6
  •  5
  •   Joe Meyer    11 年前

    对于那些寻找完整示例的人,请查看 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域控制器的情况。