通过 LDAP 使用 PHP 获取用户可读名称,只需拥有登录凭据



我正在将我的登录表单与活动目录集成Microsoft。我认证 用户通过 LDAP PHP 库。

当用户尝试登录时,他们输入用户名和密码。 成功连接到服务器,也通过"LDAP_bind"进行身份验证 根据值正确性给我真或假。 现在我无法检索用户真实姓名以将其显示在屏幕上。

我拥有的所有信息都是带有端口号的ldap uri,以及通过网络表单输入的用户名和密码。

这是我当前的代码,

$ldap = ldap_connect("ldap://abc.xyz:123");
if ($bind = ldap_bind($ldap, $_REQUEST['username'].'@abc.xyz',$_REQUEST['password'])) 
{ echo "Welcome". $_REQUEST['username'];}

$_REQUEST['用户名'] 不是人类可读的,所以我需要读取此用户属性或至少仅显示名称。

ldap_search和ldap_read函数没有帮助,我尝试了以下代码:

$ldap_base_dn = 'DC=abc,DC=xyz';
$search_filter = "(objectclass=*)";
$result = ldap_search($ldap_connection, $ldap_base_dn, $search_filter);

如果没有运气,我必须拥有任何其他信息才能使ldap_search或ldap_read成功工作。 换句话说,这可以通过仅使用用户名和密码以及LDAP URI来完成吗?

您应该能够像这样进行搜索:

$upn = $_REQUEST['username'].'@abc.xyz';
$attributes = ['displayname'];
$filter = "(&(objectClass=user)(objectCategory=person)(userPrincipalName=".ldap_escape($upn, null, LDAP_ESCAPE_FILTER)."))";
$baseDn = "DC=abc,DC=xyz";
$results = ldap_search($ldap, $baseDn, $filter, $attributes);
$info = ldap_get_entries($ldap, $results);
// This is what you're looking for...
var_dump($info[0]['displayname'][0]);

此外,请确保使用以下选项进行绑定:

$ldap = ldap_connect("ldap://abc.xyz:123");
ldap_set_option($ldap, LDAP_OPT_PROTOCOL_VERSION, 3);
ldap_set_option($ldap, LDAP_OPT_REFERRALS, 0);
if ($bind = ldap_bind($ldap, $_REQUEST['username'].'@abc.xyz',$_REQUEST['password']))

返回DisplayName值时,我建议您使用搜索过滤器,该过滤器使用(samaccountname=$u)简单的东西查找samaccountname(用户名),$u是 LDAP 连接的用户名。如果你的Active Directory/Open Directory有很多对象,我肯定会建议以OU为目标,因为这个查询很快就会落在它的底部。

我已经对您的代码进行了一些进一步的更改,因此它现在在一个函数中运行,该函数需要 3x 参数,如果连接或身份验证失败,则返回 false。

检查 LDAP- 如果登录成功,则返回显示名称;如果登录或连接失败,则返回FALSE(布尔值)。

function chkLDAP($u, $pass, $domain) {
$dom = "$domain\"; //Domain Prefix for UNAME which ouputs "domain"
$user = $dom . $u; 
$hostname = 'ldap://abc.com';
$baseDN = 'OU=users, DC=abc, DC=com'; //Narrow down if you have alot of objects as search could take along time
$search = "(samaccountname=$u)"; //Compare with Username
$ldap = ldap_connect($hostname);
if ($ldap) {
$ldapbind = ldap_bind($ldap, $user, $pass);
if ($ldapbind) {
$ldapSearch = ldap_search($ldap, $baseDN, $search);
$entry = ldap_first_entry($ldap, $ldapSearch);
$info = ldap_get_values($ldap, $entry, "displayname"); 
return $info[0];
}
return false; //Failed Auth
} 
return false; //Connection Failed
}

只需测试函数是否为 false,以确保您在使用它之前有一个displayname

运行函数:

$displayName = chkLDAP($_REQUEST['username'], $_REQUEST['password'], 'abc.com'); //Run Function - Returns False if Failed or Displayname if True
if ($displayName !== false) {
echo $displayName;
} else {
echo "Username or Password Incorrect!";
}

看:

http://php.net/manual/en/function.ldap-get-values.php

这对于需要验证特定 OU 中是否存在用户的人很有用。 (借助@kitson88响应)

function validateLogin($username,$password)
{

$ldap_dn = "$username@alhait.com";
$ldap_password =$password;

$ldap_con = ldap_connect("server");
ldap_set_option($ldap_con, LDAP_OPT_PROTOCOL_VERSION, 3);
if(@ldap_bind($ldap_con,$ldap_dn,$ldap_password))
{
$baseDN = 'OU=trainers,DC=alhait,DC=com';
$search = "(samaccountname=$username)";
$ldapSearch = ldap_search($ldap_con, $baseDN, $search);
$entry = ldap_first_entry($ldap_con, $ldapSearch);
$info = ldap_get_values($ldap_con, $entry, "displayname"); 
// var_dump($info[0]);
if($info[0]!=null)
{
return true;
}
}else{
return false;
}
//echo "Invalid Credential";
return false;

}

相关内容

最新更新