首页 文章

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

提问于
浏览
1

我正在将我的登录表单与Microsoft活动目录集成 . 我通过LDAP php库验证用户 .

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

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

这是我目前的代码,

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

2 回答

  • 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']))
    
  • 0

    返回 DisplayName 值时,我建议您使用搜索过滤器,该过滤器使用 (samaccountname=$u) 这样简单的查找 samaccountname (用户名),其中 $u 是LDAP连接的用户名 . 如果您的Active Directory / Open Directory有很多对象,我肯定会建议很快定位OU 's as this query can fall on it'的底部 .

    我对你的代码进行了一些进一步的更改,所以它现在在一个函数中运行,该函数需要3x参数并且如果连接或认证失败则返回false .

    Check 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 .

    Run Function:

    $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

相关问题