首页 文章

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

提问于
浏览
96

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

  • 编辑:我已经准备好了...当有人已经这样做时发明轮子是愚蠢的 .

6 回答

  • 11

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

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

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

  • 154

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

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

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

  • 8

    我喜欢Zend_Ldap类,你可以在项目中只使用这个类,而不使用Zend Framework .

  • 13

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

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

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

  • 6

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

相关问题