我的任务是最终实现一个单点登录解决方案,使用存储在其工作机器中的AD凭据将用户登录到我的系统。我正在使用ldap_
functions in PHP。
我遇到的问题是我必须检查多个OU的凭据(目前大约30个),而且我还没有找到从AD系统获取这些OU的方法,所以我有一个很大的OU的数组作为一种权宜之计。我用ADexplorer获得了这个列表。有没有办法用PHP做到这一点?
我的第一语言不是英语,所以我让阿德里亚诺为我翻译这个,而且我在理解文档方面也遇到了问题。
在这个阶段,我基本上是从the ldap_search manpage中的示例中复制此代码:
<?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添加到同一搜索中,则不会发生这种情况。 I.E.如果我做
$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,但结果相同。我现在正在咨询服务器人员,了解他们的限制。
答案 0 :(得分:2)
尝试将ldap_search与过滤器ObjectClass = organizationalUnit:
一起使用 $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。
答案 1 :(得分:1)
听起来您想要对域中的任何用户进行身份验证。不要搜索多个DN,只需从域的根目录搜索一次。因此,不要使用'OU=ABC,DC=xyz,DC=ac,DC=uk'
,而是使用'DC=xyz,DC=ac,DC=uk'
。
答案 2 :(得分:1)
我还没有找到从AD系统获取这些OU的方法
上面的示例表明这些OU是 直接 DC = xyz,DC = ac,DC = uk的子项?如果是这样,找到这些的最有效的LDAP搜索是:
使用相应的ldapsearch命令行测试......
ldapsearch -h <hostname> -s onelevel -b "DC=xyz,DC=ac,DC=uk" "(objectclass=organizationalUnit)"