PHP LDAP多上下文身份验证

时间:2013-02-21 10:42:06

标签: php ldap

早上好,

我有一个提供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";

    }

2 个答案:

答案 0 :(得分:0)

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

另见

答案 1 :(得分:0)

据我了解您的问题,您希望能够从上下文jondoe以及来自上下文ou=Staff,ou=Users,o=ABC的{​​{1}}验证janedoe

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

首先,您可以将所有可能的上下文添加到数组ou=Externals,ou=Others,o=ABC,然后循环遍历这些上下文以查找匹配的用户。

其次,您使用两步法,在整个LDAP中按用户名搜索用户,然后使用返回的$contexts根据LDAP对用户进行身份验证。

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

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