Страница входа в LDAP не работает

Я установил PHP в IIS и протестировал этот скрипт, но ответа нет после того, как я ввожу правильные или неправильные данные для входа. Я пытаюсь подключиться к серверу ldap через telnet, и он подключается правильно.

<?php
$LDAPserver = "ldap.server.com"; // LDAP server
$LDAPsuffix = "o=companyname, o=companynet"; // LDAP Tree

if (!empty($_POST['login']))
{
    //print_r($_POST);
    echo "<br><br>";

    $userid = $_POST['username']; // User key their userid or email
    $userpassword = $_POST['userpassword']; // User key their password

    $ds=ldap_connect($LDAPserver);  
    ldap_set_option($ds, LDAP_OPT_PROTOCOL_VERSION, 3);

    $bind=@ldap_search($ds, $LDAPsuffix, "uid=".$userid);
    if ($bind)
    {
        echo "LDAP bind success <br>";

        $result = @ldap_get_entries($ds, $bind);
        if ($result[0])
        {
            if (@ldap_bind( $ds, $result[0]['dn'], $userpassword))
            {
                echo "User bind success <br>";

                // Can proceed to check database
            }
            else
            {
                echo "User bind failed - Invalid password <br>";
            }
        }
        else
        {
            echo "User does not has LDAP account <br>";
        }
    }
    else
    {
        echo "LDAP bind failed <br>";
    }

    ldap_close($ds);

}


?>

<html>
<head>
    <title>Login with LDAP Authentication</title>
</head>
<body>

    <form action="ldaplogin.php" name="passwordChange" method="post">
    <table style="width: 400px; margin: 0 auto;">
            <tr><th>Enter username/email:</th><td><input name="username" type="text" size="0" autocomplete="off" /></td></tr>
            <tr><th>Enter your password:</th><td><input name="userpassword" size="20" type="password" /></td></tr>          
            <tr><td colspan="2" style="text-align: center;" >
            <input name="login" type="submit" value="Login"/></td></tr>
    </table>
    </form> 

    </div>
</body>
</html>

person Jayden Spancer    schedule 03.06.2015    source источник


Ответы (1)


Вам нужно ldap_bind(), прежде чем вы сможете ldap_search(). Удалите @ перед функциями, чтобы вы могли видеть ошибки, предупреждения и уведомления.

Изменить: это должно быть близко к тому, что вам нужно, и может быть скорректировано, чтобы соответствовать именно тому, что вам нужно. Это также предполагает, что ваш LDAP-сервер не разрешает анонимный поиск, если это так, вы можете изменить порядок вещей.

$LDAPserver = "ldap.server.com"; // LDAP server
$LDAPsuffix = "o=companyname, o=companynet"; // LDAP Tree

if (!empty($_POST['login'])) {
    echo "<br><br>";

    $userid = $_POST['username']; // User key their userid or email
    $userpassword = $_POST['userpassword']; // User key their password

    $ds = ldap_connect($LDAPserver);  
    ldap_set_option($ds, LDAP_OPT_PROTOCOL_VERSION, 3);

    $bind = @ldap_bind($ds, "uid=$userid,$LDAPsuffix", $userpassword);
    if ($bind !== false) {
        $search = @ldap_search($ds, $LDAPsuffix, "uid=$userid", array('uid', 'dn'));
        if ($search !== false) {
            $result = @ldap_get_entries($ds, $search);
            if (is_array($result) and $result) {
                // Can proceed to check database
            }
            elseif ($result === array()) {
                echo "no results";
            }
            elseif ($result === false) {
                echo "ldap_get_entries() failed: " . ldap_error($ds);
            }
        } else {
            echo "ldap_search() failed: " . ldap_error($ds);
        }
    }
    else {
        echo "ldap_bind() failed: " . ldap_error($ds);
    }

    @ldap_unbind($bind);
    @ldap_close($ds);
}
person mike.k    schedule 03.06.2015
comment
Ок удалил @ из функции. Теперь мне удается подключиться к ldap с правильными данными для входа. Что произошло с этой ошибкой msg Примечание PHP: Неопределенное смещение: 0 с этой строкой кода: if ($result[0]), когда я преднамеренно ввожу неверные данные для входа или оставляю поле пустым, затем нажимаю кнопку входа. - person Jayden Spancer; 03.06.2015
comment
Похоже, что $result все еще является массивом, но он пуст, поэтому у него нет индекса 0 и, следовательно, нет результатов. Попробуйте добавить еще один атрибут к ldap_search(), который представляет собой массив параметров, которые вы ищете. Ссылка: ldap_search - person mike.k; 03.06.2015
comment
Спасибо, я просто добавляю «курица» в эту строку: $result = @ldap_get_entries($ds, $bind, «курица»); - person Jayden Spancer; 04.06.2015
comment
Эта функция не принимает третий аргумент, я имел в виду ldap_search(), и это должен быть массив, например array('chicken'), если у вас есть атрибут chicken в LDAP, что было бы странно. Подождите, я отредактирую свой ответ тем, как, по моему мнению, должен выглядеть код... - person mike.k; 04.06.2015