通过仅使用登录凭据通过LDAP获取用户可读的名称

时间:2016-12-29 10:10:55

标签: php active-directory ldap

我正在将我的登录表单与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 ['username']不是人类可读的,所以我需要阅读此用户属性或至少只显示名称。

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来完成吗?

3 个答案:

答案 0 :(得分:0)

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

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

检查LDAP - 如果成功登录则返回 DisplayName ,如果登录或连接失败,则返回 FALSE(BOOL)

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

答案 1 :(得分:0)

您应该可以像这样进行搜索:

$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']))

答案 2 :(得分:0)

这对需要验证用户是否存在于特定OU中的人员有用。 (通过@ kitson88回复的帮助)

Preferences > Settings - Syntax Specific