【问题标题】:LDAP authentication - ldap_bind() method is very slowLDAP 认证 - ldap_bind() 方法很慢
【发布时间】:2019-02-25 10:23:36
【问题描述】:

我的应用程序对用户进行了 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");

【问题讨论】:

    标签: php authentication active-directory ldap window


    【解决方案1】:

    值得一提的是您使用的是什么 LDAP 服务器。如果您使用的是 Windows AD/LDAP,这可能很有用:

    Windows 尝试从其自己的服务器和第三方服务器检索新的 CRL(证书吊销列表)。这看起来正好在 15 秒内超时。如果计算机被隔离或无法通过 Internet 访问这些资源(被阻止/防火墙、连接速度慢等),则可能会出现这种情况。

    如果您的 CA/Certificate 已经在网络服务器上可用,您可以尝试降低超时时间,看看是否可以解决问题?

    我们只需要在服务器上执行以下步骤:

    启动 gpedit.msc -> 本地计算机策略 -> 计算机配置 -> 管理模板 -> 系统 -> Internet 通信管理 -> Internet 通信设置 -> 关闭自动根证书更新 = 启用

    启动 gpedit.msc -> 本地计算机策略 -> 计算机配置 -> Windows 设置 -> 安全设置 -> 公钥策略 -> 证书路径验证路径。选择选项卡“网络检索”并启用“定义这些策略设置”。取消选择“自动更新根...”最重要的是将超时值设置为 1。

    【讨论】:

      【解决方案2】:

      您可以抓取网络数据包捕获(例如 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>";
      ?>
      

      【讨论】:

        猜你喜欢
        • 2012-12-17
        • 2015-05-21
        • 1970-01-01
        • 1970-01-01
        • 2013-10-24
        • 2012-10-09
        • 2013-01-26
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多