Аутентификация LDAP - метод ldap_bind () очень медленный - PullRequest
0 голосов
/ 21 сентября 2018

Мое приложение имеет аутентификацию ldap для пользователей.

Когда я проверяю подлинность, процесс занимает от 10 до 15 секунд.Если я немедленно выйду из системы и войду снова.Это просто занимает 100 мс или что-то очень медленное время.Через некоторое время, когда я пытаюсь войти снова, это снова занимает 10-15 секунд.

Это очень быстро, когда мы подключаемся с моего персонального компьютера с Windows, но отнимаем время с нашего компьютера с веб-сервером.

В чем может быть причина этой проблемы?

Нижемой код это удается, но нужно время, чтобы завершить.Если я обновлю эту страницу снова, она мгновенная.

ldap_set_option(NULL, LDAP_OPT_DEBUG_LEVEL, 7);

            //Our Ip address \/
$l = ldap_connect("ldap://1.2.3.4:389"); 
ldap_set_option($l, LDAP_OPT_PROTOCOL_VERSION, 3);
ldap_set_option($l, LDAP_OPT_REFERRALS, 0);

//This takes very long time.
ldap_bind($l, "CN=work,OU=XX-ALL,DC=Example,DC=com", "workPassword");  
echo(ldap_error($l)."\n");

1 Ответ

0 голосов
/ 26 сентября 2018

Вы можете получить захват сетевого пакета (например, Wireshark) - поскольку вы используете открытый текст LDAP, он будет читабельным.Вы увидите метки времени с высоким разрешением для пакетов и сможете определить, где происходит задержка.Вы также можете сократить время для различных компонентов процесса аутентификации в коде, чтобы получить лучшее представление о , что занимает много времени (пример ниже).

Существуют ли основные проблемы в сети - например, много повторно переданных пакетов?

При использовании SSL согласование сеанса SSL может занять много времени.

Получаете ли вы разные результаты, используя VIP с балансировкой нагрузки (если таковой существует) и каждый сервер каталогов?Может быть определенный сервер, который работает плохо.Я также столкнулся с конфигурациями балансировщика нагрузки, которые привели к большой задержке (VIP был медленным, каждый сервер каталогов работал нормально) и смог привлечь сетевую команду, предоставив хорошую статистику.

<?php
// Turn off all error reporting
error_reporting(0);
function getLDAPBindTime($strHostname, $iPort, $strDescription){
    $ldaprdn  = 'uid=SystemAccount,ou=SystemIDs,o=Company';
    $ldappass = 'SystemAccountPassword';
    $ldaproot = 'ou=SystemIDs,o=Company';
    $iUserObjectClass  = 'inetOrgPerson';
    echo "<tr><td>$strHostname</td><td>$strDescription</td>";

    $strConnectString = "ldaps://" . $strHostname . ":" . $iPort;

    $totaltime = microtime();
    $totaltime = explode(' ', $totaltime);
    $totaltime = $totaltime[1] + $totaltime[0];
    $totalbegintime = $totaltime;


    $ds = ldap_connect($strConnectString) or $tempflag = 1;
    ldap_set_option($ds, LDAP_OPT_PROTOCOL_VERSION, 3) or $ldaperrflag = 1;
    $totaltime = microtime();
    $totaltime = explode(' ', $totaltime);
    $totaltime = $totaltime[1] + $totaltime[0];
    $bindbegintime = $totaltime;

    if ($ds) {
        $scriteria="(&(objectClass=$iUserObjectClass))";
        $ldapbind = ldap_bind($ds, $ldaprdn, $ldappass) or $otherflag =1;
        $resultcode = ldap_errno($ds);
        if($resultcode != 0){
            $ldaperrflag = 2;
        }
        else{
            $totaltime = microtime();
            $totaltime = explode(' ', $totaltime);
            $totaltime = $totaltime[1] + $totaltime[0];
            $querybegintime = $totaltime;

            $sr=ldap_search($ds,$ldaproot,$scriteria);
            $info = ldap_get_entries($ds, $sr);
            if($info["count"] > 3){
                $ldaperrflag = 0;
            }
            else{
                $ldaperrflag = $ldaperrflag + 5;
            }
        }
        ldap_close($ds);
    }

    $totaltime = microtime();
    $totaltime = explode(" ", $totaltime);
    $totaltime = $totaltime[1] + $totaltime[0];
    $totalendtime = $totaltime;

    $totaltime = ($totalendtime - $totalbegintime)*1000;
    $totalconnect = ($bindbegintime - $totalbegintime)*1000;
    $totalbind = ($querybegintime - $bindbegintime)*1000;
    $totalquery = ($totalendtime - $querybegintime)*1000;

    $totaltime = round($totaltime,2);
    $totalconnect = round($totalconnect,2);
    $totalbind = round($totalbind,2);
    $totalquery = round($totalquery,2);

    if($ldaperrflag == 2 || $ldaperrflag == 6 || $ldaperrflag == 3 || $ldaperrflag == 7 || $ldaperrflag == 8 || $ldaperrflag == 1){
        echo "<td><font color=red>Failed to connect or bind to server</font></td><td>n/a</td><td>n/a</td><td>n/a</td><td>$totaltime ms</td>";
    }
    if($ldaperrflag == 5){
        echo "<td><font color=red>Bind successful, search failed</font></td><td>$totalconnect ms</td><td>$totalbind ms</td><td>$totalquery ms</td><td>$totaltime ms</td>";
    }
    if($ldaperrflag == 0){
        echo "<td><font color=green>Bind and search successful</font></td><td>$totalconnect ms</td><td>$totalbind ms</td><td>$totalquery ms</td><td>$totaltime ms</td>";
    }
    echo "</tr>";

}


set_time_limit(300);

echo "<head><title>iPlanet LDAP Service Status</title></head><body>";
echo "<h3>iPlanet LDAP Service Status</h3>";

echo "<table cellpadding=1 border=1>";
echo "<tr><td><b>Server</b></td><td><b>Description</b></td><td><b>Status</b></td><td><b>Connect Time</b></td><td><b>Bind Time</b></td><td><b>Query Time</b></td><td><b>Total Time Elapsed</b></td></tr>";


getLDAPBindTime("VIPName.company.gTLD", 636, "ldap.company.gTLD VIP");
getLDAPBindTime("hostname1.company.gTLD", 1636, "LDAP Master Server");
getLDAPBindTime("hostname2.company.gTLD", 1636, "LDAP Master Server");

echo "</table><P>";


echo "</table><p>";
putenv('TZ=GMT');
echo "<font size=-1><P><i>Current time in GMT is ";
echo date("d M Y H:i");
echo '</i><P><a href="https://site.company.gTLD:1977/svcstatus/">Back</a></font>';

echo "</body>";
?>
...