1

我的任务最终是实施单点登录解决方案,使用存储在他工作机器中的 AD 凭据将用户登录到我的系统。我正在使用ldap_PHP 中的函数

我遇到的问题是我必须针对多个 OU(目前大约 30 个)检查凭据,而且我还没有找到从 AD 系统获取这些 OU 的方法,所以我有一大堆 OU作为权宜之计。我通过 ADexplorer 获得了这份清单。有没有办法用 PHP 做到这一点?

我的第一语言不是英语,所以我让 Adriano 为我翻译这个,而且我在理解文档时也遇到了问题。

在这个阶段,我基本上是从ldap_search 手册页的示例中复制这段代码:

<?php
$ds=ldap_connect($ldapserver);

// 42 OUs in our case
$dn[]='OU=ABC,DC=xyz,DC=ac,DC=uk';
$dn[]='OU=DEF,DC=xyz,DC=ac,DC=uk';
// ...

$totalDns = count($dn);
for ($i = 0; $i < $totalDns; $i++) {
    $id[] = $ds;
}

$filter = 'samaccountname='.$_POST['username'];

$result = ldap_search($id,$dn,$filter);

$search = false;

foreach ($result as $value) {
    if(ldap_count_entries($ds,$value)>0){
        $search = $value;
        break;
    }
}

if($search){
    $info = ldap_get_entries($ds, $search);
}else{
    $info = 'No results found';
}

更新

我尝试了 Vladislav Ross 建议的解决方案,几秒钟后,服务器吐出这个:

mod_fcgid: stderr: PHP Warning:  ldap_search() [<a href='function.ldap-search'>function.ldap-search</a>]: Search: Can't contact LDAP server in ... on line 28

如果我在同一搜索中添加特定的 OU,则不会发生这种情况。IE 如果我这样做

$sr = ldap_search(
     $ds,
     "OU=Usuarios,dc=test,dc=com",
     "ObjectClass=organizationalUnit",
     array("")
);

代替

$sr = ldap_search(
      $ds,
      "dc=test,dc=com",
      "ObjectClass=organizationalUnit",
      array("")
);

我确实得到了正确的结果。我尝试将 timelimit 和 sizelimit 参数设置为 0,但结果相同。我现在正在咨询服务器人员,看看他们的限制是什么。

4

3 回答 3

2

尝试使用带有过滤器 ObjectClass=organizationalUnit 的 ldap_search:

    $ds = ldap_connect($AD_server);
    if(!$ds) die("cannot connect to LDAP server at $AD_server.");

    $r = ldap_bind($ds, $AD_Auth_User, $AD_Auth_PWD);
    if(!$r)
    {
        ldap_get_option($ds,LDAP_OPT_ERROR_STRING,$error);
        die("cannot bind to LDAP server at $AD_server ($error).");
    };

    $sr=ldap_search($ds,"dc=test,dc=com","ObjectClass=organizationalUnit",array(""));
    $info = ldap_get_entries($ds, $sr);

    print_r($info); //<--array with OU's you need

如果不需要递归搜索,请使用 ldap_list 而不是 ldap_search。

于 2013-01-16T14:47:58.897 回答
1

听起来您想对域中的任何用户进行身份验证。不要搜索多个 DN,只需从域的根目录搜索一次。因此,不要使用'OU=ABC,DC=xyz,DC=ac,DC=uk',而是使用'DC=xyz,DC=ac,DC=uk'

于 2013-01-17T14:09:51.377 回答
1

我还没有找到从 AD 系统获取这些 OU 的方法

您上面的示例表明这些 OU 是DC=xyz,DC=ac,DC=uk的直接子代?如果是这样,找到这些的最有效的 LDAP 搜索是:

  • 搜索库:DC=xyz,DC=ac,DC=uk
  • 搜索范围:onelevel <--搜索库的直接子级
  • 搜索过滤器:(objectclass=organizationalUnit)

像这样使用相应的 ldapsearch 命令行进行测试...

ldapsearch -h <hostname> -s onelevel -b "DC=xyz,DC=ac,DC=uk" "(objectclass=organizationalUnit)"
于 2013-01-18T14:26:11.690 回答