使用AD LDS进行php登录失败

时间:2014-10-09 04:30:28

标签: php ldap adlds

我正在尝试编写一个基本的PHP脚本,它连接到我的AD LDS实例并对用户进行身份验证,但我的登录失败。脚本是:

<?php
include("authenticate.php");

// check to see if user is logging out
if(isset($_GET['out'])) {
    // destroy session
    session_unset();
    $_SESSION = array();
    unset($_SESSION['user'],$_SESSION['access']);
    session_destroy();
}

// check to see if login form has been submitted
if(isset($_POST['userLogin'])){
    // run information through authenticator
    if(authenticate($_POST['userLogin'],$_POST['userPassword']))
    {
        // authentication passed
        header("Location: success.php");
        die();
    } else {
        // authentication failed
        $error = 1;
    }
}

// output error to user
if (isset($error)) echo "Login failed: Incorrect user name, password, or rights<br /-->";

// output logout success
if (isset($_GET['out'])) echo "Logout successful";
?>

<form action="login.php" method="post">
    User: <input type="text" name="userLogin" /><br />
    Password: <input type="password" name="userPassword" />
    <input type="submit" name="submit" value="Submit" />
</form>

验证功能如下: 对于ldap_dn和ldap_host,我已经分别为活动目录的名称和AD LDS服务器的主实例添加了值。

function authenticate($user, $password) {
    // Active Directory server
    $ldap_host = "server";

    // Active Directory DN
    $ldap_dn = "O=mycompany,C=US";

    // connect to active directory
    $ldap = ldap_connect($ldap_host);

    // verify user and password
    if($bind = @ldap_bind($ldap, $user, $password)) {
        // valid
        echo "<script>alert('valid');</script>";
        // check presence in groups
        $filter = "(userPrincipalName=" . $user . ")";
        $attr = array("memberof");
        $result = ldap_search($ldap, $ldap_dn, $filter, $attr) or exit("Unable to search LDAP server");
        $entries = ldap_get_entries($ldap, $result);
        ldap_unbind($ldap);
if($result){
            $_SESSION['user'] = $user;
            return true;
        }
        else{
            return false;
        }

    } else {
        // invalid name or password
        return false;
    }
    if($ldap)
        return true;
    else
        return false;
}

我仍然遇到登录失败。我是否错误地设置了ldap主机或ldap_dn?如果是,我需要设置什么值?

1 个答案:

答案 0 :(得分:0)

据我所知ldap_bind期望给定的用户名是DN。而你只是提供一个用户名。我怀疑这是否有效。

当我在做LDAP-Logins时,我总是做一个firt bind来使用匿名绑定或专用用户帐户从用户名获取DN,并且只要有DN我就使用第二个绑定刚刚检索到的DN和提供的密码。这总是像魅力一样。而且我可以为自己定义在搜索DN时使用的属性,我可以使用任何(唯一的)attriute来登录。

我创建了一个little gist来展示基本概念。