0

早上好,

我有一个提供 LDAP 身份验证(下面的代码)的 php 脚本,但是我需要对多个上下文进行身份验证。

我不确定解决此问题的最佳方法,并想知道是否有人可能有任何指示/建议。

亲切的问候,本

$username = $_POST["username"];
$password = $_POST["password"];

//$ipaddressreceived = $_POST["ipaddress"];
$ldapcontext = "ou=Staff, ou=Users,o=ABC";
$ldapconn = ldap_connect("IPADDRESS");  // must be a valid LDAP server!
$ldaprdn = "cn=$username,$ldapcontext";

function authenticate($username, $password) {

        global $ldapconn;
        global $username;
        global $password;
        global $ldaprdn;
        // Prevent null binding
        if ($username === NULL || $password === NULL) { return false; } 
        if (empty($username) || empty($password)) { return false; }

        // Bind as the user        
        $ldapbind = ldap_bind($ldapconn, $ldaprdn, $password);;
        if ($ldapbind) { $ret = true;
        } else {
            $ret = false;
        }

        return $ret;
    }

$authUser=authenticate($username, $password);

if ($authUser == true) {


    session_start();
    $_SESSION["username"]=$username;

    $ldapfields = array("cn", "givenname", "sn", "mail");

    $ldapsearch=ldap_search($ldapconn, "$ldapcontext", "cn=$username", "$ldapfields");  
    $info = ldap_get_entries($ldapconn, $ldapsearch);

    $givenname =  $info["sn"][0];

    $_SESSION["givenname"]=$givenname;

    $login_message = "LOGIN SUCCESSFUL";

    header("Location: index.php");
    exit;

    } else
    {
    $login_message = "Login Failed";

    }
4

2 回答 2

0

命名上下文由服务器在根 DSE 中发布(尽管此信息可能受到保护)。考虑从根 DSE 请求namingContexts多值属性。

也可以看看

于 2013-02-21T14:20:58.283 回答
0

据我了解您的问题,您希望能够jondoe从 contextou=Staff,ou=Users,o=ABC以及janedoe从 context进行身份验证ou=Externals,ou=Others,o=ABC

在我看来,只要用户名在整个 LDAP 中是唯一的,就有两种可能的方法。

首先,您可以将所有可能的上下文添加到数组中$contexts,然后遍历这些上下文以找到匹配的用户。

其次,您使用两步方法,在整个 LDAP 中通过用户名搜索用户,然后使用返回dn的用户名对 LDAP 进行身份验证。

您还可以通过提供多个搜索库并在搜索用户的步骤中迭代这些方法来组合这两种方法dn。找到用户后,您就可以使用dn和 密码对其进行身份验证。

您可以在https://github.com/heiglandreas/authLdap/blob/master/ldap.php#L222找到示例实现。

于 2013-02-22T05:49:45.980 回答