我正在将我的登录表单与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来完成吗?
答案 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!";
}
见:
答案 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