【问题标题】:PHP LDAP Connection to Authenticate against Active Directory from External ServerPHP LDAP 连接从外部服务器对 Active Directory 进行身份验证
【发布时间】:2013-01-08 22:07:11
【问题描述】:

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

外部服务器目前是 Media Temple 上的 Linux (gs),运行 PHP 5.3.15 并启用了 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

  • 我已经尝试使用“用户名”和“用户名@00.000.000.000”进行绑定

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

任何帮助将不胜感激。如果有服务器设置或那种性质的东西,很想知道。此外,我已经检查了 ADFS,但找不到一个简单的脚本来设置测试,如果它不起作用,则无需花费大量时间。

【问题讨论】:

  • 您检查过防火墙规则吗? Pinging (ICMP) 与 LDAP 连接没有真正的关系(特别是,防火墙可能允许某些连接,但不一定允许通过端口 636 从外部服务器传入连接)。
  • 考虑使用已知良好的客户端 ldapsearch 来验证客户端是否可以连接到服务器。在执行指定代码的同一主机上运行 ldapsearch 并使用相同的参数。另请参阅Using ldapsearch

标签: php active-directory ldap


【解决方案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 找到了一些不错的文档,尽管它目前似乎已关闭。谷歌缓存版本:http://webcache.googleusercontent.com/search?q=cache:http://en.gentoo-wiki.com/wiki/Active_Directory_Authentication_using_LDAP

【讨论】:

  • 感谢您的回答,亲爱的。我正在使用的外部 Linux 服务器位于不允许访问 ldap.conf 文件的网格服务上。我已经阅读了您建议的链接,并且正在设置一个专用框以永远尝试 TLS_REQCERT。我会让你知道这是否有效。 :)
  • 就是这样,让它与将cn添加到basedn一起工作。非常感谢亲爱的!!!
【解决方案2】:

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

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

【讨论】:

  • 感谢您的评论。内部服务器上的 SSL 证书是官方的并且工作正常,因此如上所述,当前使用 Attask 的连接和身份验证。除了端口之外,我什至不确定 LDAPS 与 LDAP 的区别,并且可能在主机 IP 前添加 LDAPS://。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-09-15
  • 1970-01-01
  • 1970-01-01
  • 2013-05-10
相关资源
最近更新 更多