使用PHP的LDAP身份验证


LDAP Authentication using PHP

我正在尝试使用PHP使用LDAP身份验证
以下是我的代码:

<?php
$ldaphost = 'ldap://ldapServer';
$ldapport = 389;
$ds = ldap_connect($ldaphost, $ldapport)
or die("Could not connect to $ldaphost");
    ldap_set_option($ldapconn, LDAP_OPT_PROTOCOL_VERSION, 3);
    ldap_set_option($ldapconn, LDAP_OPT_REFERRALS, 0);
//ldap_set_option($ds, LDAP_OPT_DEBUG_LEVEL, 7);
if ($ds) 
{
    $username = "testuser@domain.com";
    $upasswd = "testpass";
    $ldapbind = ldap_bind($ds, $username, $upasswd);

    if ($ldapbind) 
        {print "Congratulations! $username is authenticated.";}
    else 
        {print "Access Denied!";}

}
?>

但它提出了以下错误:

PHP警告:ldap_bind():无法绑定到服务器:无法联系LDAP服务器

你知道我该怎么解决吗?

注意:我们是否需要ldap.config文件,因为我在某个论坛上遇到了这个术语。我在我的机器上看不到任何这样的文件。我在ext文件夹中有php_ldap.dll,正在使用Windows

绑定时,绑定的不是用户名,而是DN。

您的$username变量应该如下所示:

$username = 'uid=testuser,ou=People,dc=domain,dc=com';

我想ldap_connect()不需要协议,所以这个简单的补丁应该可以解决你的问题:

--- ldap.php.bak    2012-09-04 10:52:29.563203493 +0200
+++ ldap.php    2012-09-04 10:52:46.807203766 +0200
@@ -1,6 +1,6 @@
 <?php
-$ldaphost = 'ldap://ldapServer';
+$ldaphost = 'ldapServer';
 $ldapport = 389;
 $ds = ldap_connect($ldaphost, $ldapport)

查看官方文档中的基本示例。

我不确定你是否还需要答案,但我想从我的经验中补充一些东西。

$username   = 'bentcoder';
$password   = '123123';
$server = '192.168.32.4';
$domain = '@yourdomain.com';
$port       = 389;
$ldap_connection = ldap_connect($server, $port);
if (! $ldap_connection)
{
    echo '<p>LDAP SERVER CONNECTION FAILED</p>';
    exit;
}
// Help talking to AD
ldap_set_option($ldap_connection, LDAP_OPT_PROTOCOL_VERSION, 3);
ldap_set_option($ldap_connection, LDAP_OPT_REFERRALS, 0);
$ldap_bind = @ldap_bind($ldap_connection, $username.$domain, $password);
if (! $ldap_bind)
{
    echo '<p>LDAP BINDING FAILED</p>';
    exit;
}
// You can work now!!!
ldap_close($ldap_connection);

注意:

  • 应在php.ini中启用php_ldap扩展名。[扩展名=php_ldap.dll]
  • 上面的IP地址192.168.32.4]可以替换为[yourdomain.com]
  • 如果你正在使用Wamp,那么到目前为止,你可能会遇到一些奇怪的问题请记住,在1.9版本下一切都很好,但在更高版本下则不然版本

参考文献:

  • Mozilla LDAP C SDK程序员指南
  • LDAP函数

我们在本地网络中证明了这一点,并且运行良好。例如,如果您将Ldap与Zentyal一起使用,请转到https://serveriporname/Users/Composite/Settings,然后选择它在"用户DN"中给您的选项,这样您就可以选择我们称之为$userdns的地址,您可以证明以下代码

<?php
       //The variables are implicit
    $ad = ldap_connect($ldap_server) ;  //Ex: 10.0.0.1
    ldap_set_option($ad, LDAP_OPT_PROTOCOL_VERSION, 3) ; 
       //Using the provided user and password to login into LDAP server.
       //For the dc, normally will be the domain. 
        $sr=ldap_search($ad, $userdns, "cn=*usuario*");
        $info = ldap_get_entries($ad, $sr);
       for ($i=0; $i<$info["count"]; $i++) {
          /*Print out the user information here. If you rather to request by other field than cn take its name from here*/
          print_r($info[$i]);
          echo "<p><hr/></p>";
        }
       $ds = ldap_bind($ad,"uid=$ldap_user,$userdns",$ldap_pass);
       if($ds){
      echo "<h4>$ldap_user connect to LDAP server '"$ldap_domain'"</h4>";
       } else {
         echo "<h4>Unable to connect to LDAP server</h4>";
       }  
       ldap_close($ad);
?>

正如Minras所说,您使用错误的凭据绑定。试试这样的东西:

$ldaprdn  = 'cn=binder,dc=domain,dc=com';     // ldap rdn or dn or proxy agent or admin
$ldappass = 'password';  // associated password
// connect to ldap server
$ldapconn = ldap_connect("54.85.xx.xx")
        or die("Could not connect to LDAP server.");
// Set some ldap options for talking to 
ldap_set_option($ldapconn, LDAP_OPT_PROTOCOL_VERSION, 3);
ldap_set_option($ldapconn, LDAP_OPT_REFERRALS, 0);
if ($ldapconn) {
        // binding to ldap server
        $ldapbind = @ldap_bind($ldapconn, $ldaprdn, $ldappass);
        // verify binding
        if ($ldapbind) {
            echo "Done..'n</h1>";
        } else {
            echo "Damn you LDAP...'n";
        }
}