【发布时间】: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