PHP LDAP多重绑定

时间:2016-10-21 15:39:27

标签: php authentication active-directory ldap

这里有很多新的PHP和LDAP,寻求个人项目的帮助(试着自学!)。

我想使用简单的登录框密码保护我们网站上的某些页面。

我的 login.php 页面包含一个简单的登录表单,其中包含用户名密码输入。我已设法使用下面的代码使登录过程正常工作。我可以使用我的Active Directory用户名/密码通过此表单登录并继续到所需的页面,没有问题。

但是我不确定我是否采用'正确'方式。

我的代码;

ldap.php

session_start();

function authenticate($user, $password) {
    if(empty($user) || empty($password)) return false;
    $ldaphost = "ad.example.com"; 
    $ldap_dn = "DC=ad,DC=example,DC=com"; 
    $ldap_user_group = "Staff"; 
    $ldap_usr_dom = '@ad.example.com'; 
    $ldap = ldap_connect($ldaphost);

    if($bind = ldap_bind($ldap, $user.$ldap_usr_dom, $password) or die ("Error: ".ldap_error($ldap))) {
        $filter = "(sAMAccountName=".$user.")";
        $attr = array("");
        $result = ldap_search($ldap, $ldap_dn, $filter) or exit("Unable to search LDAP server") or die ("Error searching: ".ldap_error($ldap));
        $entries = ldap_get_entries($ldap, $result);
        ldap_unbind($ldap); 
    }   

    foreach($entries[0]['memberof'] as $grps) {
        if(empty($grps) || empty($ldap_user_group)) return false;
        if(strpos($grps, $ldap_user_group)) {
            $access = 1;
        } else {
        }
    }

    if($access != 0) {
            $_SESSION['user'] = $user;
            $_SESSION['access'] = $access;
            return true;
        }  else {
        return false;
    }
}

我已被告知(由其他人)这个特定的LDAP身份验证过程应分两步完成,如下所示;

  • 搜索输入的用户名。我建议您使用搜索用户DN和密码 - 具有搜索权限的用户。在进行搜索之前,它会与这些凭据绑定。如果搜索成功,它将检索找到的用户的DN和搜索属性,该属性稍后将用于查找成员记录
  • 然后使用检索到的用户DN和输入的密码进行第二次绑定。如果此绑定成功,则对用户进行身份验证。

我的问题是;

  • 以上陈述是否正确?
  • 是否需要两个“绑定”?
  • 我不能只使用用户输入的凭据绑定LDAP连接吗?

任何建议都表示赞赏,我很难真正理解认证过程:s

1 个答案:

答案 0 :(得分:1)

简短回答:

  • 没有

答案很长: 目前,您只能绑定用户的用户名和电子邮件地址。这只适用于AD作为后端。所以,当你想做一个AD-Authenticator时,那没关系。但是你特别要求提供LDAP-Authenticator。并且LDAP绑定仅与DN一起用作“用户名”。由于大多数用户不知道他们更容易记住电子邮件地址或登录用户名。因此,您需要找到用户登录数据的DN。因此,您需要在LDAP中进行搜索,并且必须绑定。因此,要绑定为您需要绑定的用户...要绕过该循环依赖关系,您需要首先绑定为具有对目录的读访问权并使用该会话查找用户的DN的人。找到后,使用该DN和用户提供的密码进行第二次绑定以验证用户凭据。

两天前我在zendcon上谈过这个问题。您可以在https://heiglandreas.github.io/slidedeck/Directory_Authentication_with_LDAP/20161019%20-%20zendcon/index_online.html

找到包含一些示例的幻灯片