【问题标题】:ldap auth with php fails intermittentlyldap auth 与 php 间歇性失败
【发布时间】:2015-10-29 12:56:49
【问题描述】:

我已经组装了一个基本的网络应用程序,实际的网络应用程序本身可以正常工作。但是,我想使用我们现有的 ldap 服务器添加用户身份验证。 ldap 脚本似乎间歇性地工作,当登录前几次尝试将失败并显示“访问被拒绝”消息时,它将进行身份验证。我在没有应用程序的情况下单独运行脚本,并且适用相同的行为。

我似乎无法在任何地方解决问题,我只能假设它发生在 ldap 端而不是 php 端。我已经包含了下面的脚本,任何帮助都会很棒。

在写这个的时候,验证失败了 3 次,通过了两次...

<?php

$user = $_POST['login-name'];
$password = $_POST['login-pass'];

$ldap_user = 'uid='.$user.',ou=people,dc=ourdomain,dc=com,dc=au';
$ldap_pwd = $password;

$ldaphost = 'ldap://ldapserver.domain.com';
$ldapport = 389;

$ds = ldap_connect($ldaphost, $ldapport)
or die("Could not connect to $ldaphost");
if ($ds)
{
    $username = $ldap_user;
    $upasswd = $password;

    $ldapbind = ldap_bind($ds, $username, $upasswd);


    if ($ldapbind)
        {
            //print "Congratulations! $username is authenticated.";
            header('Location: message.html');
        }
    else
        {print "Access Denied!";}


}
?>

【问题讨论】:

  • 失败时是否收到“拒绝访问”或“无法连接到 $ldaphost”?您是否总是使用具有相同凭据的同一用户?您可以在else-block 中添加对ldap_error() 的调用吗?
  • ldap_connect 连接,但只检查提供的 URI 或 FQDN 或 IP 地址是否有意义!你应该依赖它的结果来检查服务器是否真的可以访问!
  • @heiglandreas - 我被拒绝访问,从来没有“无法连接”。我尝试过使用各种用户凭据,但总是会出现相同的结果。我当然可以将 ldap_error() 添加到 else 块中。他们是使用 ldap_connect 的更好选择吗?
  • 除了使用 ldap_connect 之外别无他法。它检查 LDAP 服务器的 URI 或地址是否有意义并返回一个连接句柄。这是一个误导性的命名,因为在第一个 ldap_bind 之前不会启动实际连接。因此 ldap_bind 上会出现连接问题,不会出现在 ldap_connect 上。
  • 因此,当您使用“user 1”进行测试时,您将始终能够连接,但使用“user2”则永远无法连接?或者无论您尝试哪个用户,它有时有效,有时无效?

标签: php apache active-directory ldap


【解决方案1】:

您可能应该使用

将 LDAP 协议版本设置为 3
ldap_set_option($ds, LDAP_OPT_PROTOCOL_VERSION, 3);

在致电ldap_bind()之前。

我在http://php.net/manual/de/function.ldap-bind.php#72795找到了这个

【讨论】:

  • 没错!我从 ldap_error() 快速搜索了一下,特别是使用 OpenLDAP 时,您必须指定版本。它现在按预期工作,非常感谢您的帮助!
猜你喜欢
  • 1970-01-01
  • 2019-04-18
  • 2011-10-21
  • 1970-01-01
  • 1970-01-01
  • 2017-04-19
  • 1970-01-01
  • 2023-04-02
  • 1970-01-01
相关资源
最近更新 更多