【问题标题】:PHP LDAP Multiple BindsPHP LDAP 多重绑定
【发布时间】:2016-10-21 15:39:27
【问题描述】:

这里是 PHP 和 LDAP 的新手,正在寻求个人项目的帮助(尝试自学!)。

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

我的 login.php 页面包含一个简单的登录表单,其中包含 usernamepassword 输入。我已经设法使用下面的代码使登录过程正常工作。我可以使用我的 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

【问题讨论】:

    标签: php authentication active-directory ldap


    【解决方案1】:

    简答:

    • 是的
    • 是的
    • 没有

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

    就在两天前,我在 zendcon 上做了一次演讲。您可以在 https://heiglandreas.github.io/slidedeck/Directory_Authentication_with_LDAP/20161019%20-%20zendcon/index_online.html

    找到带有一些示例的幻灯片

    【讨论】:

    • 感谢您的帮助,您的幻灯片非常有帮助 - 我本可以早些使用它们的,哈哈 :)
    猜你喜欢
    • 2019-10-06
    • 2014-09-24
    • 2013-06-27
    • 1970-01-01
    • 2022-07-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多