用于从外部服务器对Active Directory进行身份验证的PHP LDAP连接

时间:2013-01-08 22:07:11

标签: php active-directory ldap

我有一个外部Web服务器试图通过LDAP对内部服务器上的Active Directory进行身份验证。我能够在本地连接和验证,但使用相同的代码(切换主机和端口)无法在外部进行身份验证。我们还有其他能够连接和验证的服务,例如Attask(http://www.attask.com/)。

外部服务器目前是运行PHP 5.3.15的Media Temple上的Linux(gs),启用了LDAP支持。

内部服务器当前是带有LDAP和Active Directory的Windows Server 2008框。

下面的代码是我正在使用的当前PHP能够在本地连接,但在外部服务器上有问题。它基本上使用PHP LDAP连接字符串并尝试绑定。如果失败,它会尝试匿名绑定。这两个都不在外部工作并返回错误:无法联系LDAP服务器。

<?php
$username = 'username';
$password = 'password';

$ldapconfig['host'] = '00.000.000.000';
$ldapconfig['port'] = '636';
$ldapconfig['basedn'] = 'dc=client,dc=eqc,dc=local';

$ds=ldap_connect($ldapconfig['host'], $ldapconfig['port']);

ldap_set_option($ds, LDAP_OPT_PROTOCOL_VERSION, 3);
ldap_set_option($ds, LDAP_OPT_REFERRALS, 0);
ldap_set_option($ds, LDAP_OPT_NETWORK_TIMEOUT, 10);

$dn="".$username."";

if ($bind=ldap_bind($ds, $dn, $password)) {
  echo("Login correct");
} else {

  echo("Unable to bind to server.</br>");

  echo("msg:'".ldap_error($ds)."'</br>".ldap_errno($ds)."");

  if ($bind=ldap_bind($ds)) {

    $filter = "(cn=*)";

    if (!($search=@ldap_search($ds, $ldapconfig['basedn'], $filter))) {
      echo("Unable to search ldap server<br>");
      echo("msg:'".ldap_error($ds)."'</br>");
    } else {
      $number_returned = ldap_count_entries($ds,$search);
      $info = ldap_get_entries($ds, $search);
      echo "The number of entries returned is ". $number_returned."<p>";
      for ($i=0; $i<$info["count"]; $i++) {
        var_dump($info[$i]);
      }
    }
  } else {
    echo("Unable to bind anonymously<br>");
    echo("msg:".ldap_error($ds)."<br>");
  }
}
?>

一些注意事项:

  • 外部LDAP服务器正在使用LDAPS,因此建议的主机是端口636上的ldaps://00.000.000.000

  • 我已尝试使用'username'以及'username@00.000.000.000'绑定

  • 有防火墙,但是,外部服务器可以成功ping内部LDAP服务器,因此在该级别上发生了连接。

非常感谢任何帮助。如果有服务器设置或那种性质的东西,很想知道。另外,我已经检查了ADFS虽然找不到一个简单的脚本来设置测试而不花费很多时间,如果它不起作用。

2 个答案:

答案 0 :(得分:1)

当使用Linux框中的LDAPS连接到AD时,我总是需要添加行

TLS_REQCERT never
/etc/ldap.conf中的

或等效的(可能需要重启apache - 不确定)。您也可以尝试使用主机格式“ldaps://server.domain.tld:636”,但我不认为这是问题所在。

我在http://en.gentoo-wiki.com/wiki/Active_Directory_Authentication_using_LDAP找到了一些不错的文档,虽然它现在似乎已经失效了。 Google的缓存版本:http://webcache.googleusercontent.com/search?q=cache:http://en.gentoo-wiki.com/wiki/Active_Directory_Authentication_using_LDAP

答案 1 :(得分:0)

您是否检查过它是否是SSL证书错误?您使用的是自签名证书还是官方证书?

“如果您正在使用SSL(例如ldaps)并且ldap_bind正在抛出'无法绑定到服务器:'错误,请检查ldap_connect中使用的主机名是否与LDAP服务器上的SSL证书中的”CN“匹配” Source