ldap_connect

(PHP 4, PHP 5, PHP 7, PHP 8)

ldap_connect连接到 LDAP 服务器

描述

ldap_connect(?string $uri = null): LDAP\Connection|false
警告

从 PHP 8.3.0 开始,以下签名已弃用。

ldap_connect(?string $host = null, int $port = 389): LDAP\Connection|false

创建一个 LDAP\Connection 连接,并检查给定的 uri 是否合理。

注意: 此函数不会打开连接。它检查给定的参数是否合理,并在需要时用于打开连接。

参数

uri

完整 LDAP URI,格式为 ldap://hostname:portldaps://hostname:port 用于 SSL 加密。

您还可以提供多个以空格分隔的 LDAP URI 作为单个字符串。

请注意,hostname:port 不是支持的 LDAP URI,因为缺少架构。

host

要连接到的主机名。

port

要连接到的端口。

返回值

当提供的 LDAP URI 似乎合理时,返回一个 LDAP\Connection 实例。这是对提供的参数的语法检查,但不会联系服务器!如果语法检查失败,则返回 falseldap_connect() 否则将返回一个 LDAP\Connection 实例,因为它实际上不会连接,而只是初始化连接参数。实际连接在下次调用 ldap_* 函数时发生,通常使用 ldap_bind()

如果未指定任何参数,则将返回已打开连接的 LDAP\Connection 实例。

变更日志

版本 描述
8.3.0 现在已弃用使用单独的 hostnameport 调用 ldap_connect()
8.1.0 现在返回一个 LDAP\Connection 实例;以前,返回的是 资源

示例

示例 #1 连接到 LDAP 服务器的示例。

<?php

// LDAP 变量
$ldapuri = "ldap://ldap.example.com:389"; // 您的 ldap-uri

// 连接到 LDAP
$ldapconn = ldap_connect($ldapuri)
or die(
"该 LDAP-URI 不可解析");

?>

示例 #2 安全连接到 LDAP 服务器的示例。

<?php

// 确保您的主机是正确的
// 您为其颁发了安全证书的主机
$ldaphost = "ldaps://ldap.example.com/";

// 连接到 LDAP
$ldapconn = ldap_connect($ldaphost)
or die(
"该 LDAP-URI 不可解析");

?>

参见

添加注释

用户贡献的注释 29 个注释

46
nemanja at prolux-universal dot com
9 年前
如果您不希望您的 PHP 程序在您的一个企业 DC 出现故障时等待 XXX 秒后才放弃,并且由于 ldap_connect() 没有机制在用户指定的时间内超时,这是我的解决方法,它显示了出色的实际效果。

===========================================================
function serviceping($host, $port=389, $timeout=1)
{
$op = fsockopen($host, $port, $errno, $errstr, $timeout);
if (!$op) return 0; //DC 不可用
else {
fclose($opanak); //显式关闭打开的套接字连接
return 1; //DC 正常运行,我们可以安全地使用 ldap_connect 连接
}
}

// ##### 静态 DC 列表,如果您的 DNS 轮询未设置
//$dclist = array('10.111.222.111', '10.111.222.100', '10.111.222.200');

// ##### 动态 DC 列表,按轮询结果排序的反向 DNS 查询
$dclist = gethostbynamel('domain.name');

foreach ($dclist as $k => $dc) if (serviceping($dc) == true) break; else $dc = 0;
//经过此循环后,要么至少有一个 DC 目前可用,要么 $dc 将返回 bool false,而下一行将阻止程序进一步执行

if (!$dc) exit("目前没有域控制器可用,请稍后再试!"); //通知用户

//现在,ldap_connect 肯定会成功连接到之前测试的 DC,并且不会出现超时
$ldapconn = ldap_connect($dc) or die("DC 不可用,请稍后再试。");
===========================================================

此外,通过这种方法,您获得了非常好的故障转移功能,例如一家拥有数十个 DC 的公司,这些 DC 分布在遥远的地方,通过这种方式,即使只有一个 DC 当前处于活动状态,您的 PHP 程序也将始终具有高可用性。
4
lee at lareck70 dot net
9 年前
要在没有 "c:\openldap\sysconf\ldap.conf" 的情况下在 Windows 上使用 LDAPS
生成一个类似于 ldap.conf 的文件,将其命名为 "ldaprc"。
对于在命令行上运行的 PHP 脚本,将文件放在脚本中。
对于在 Web 服务器上运行的 PHP 脚本,将文件放在 PHP 的主目录中。
24
Andrew (a.whyte at cqu.edu.au)
20 年前
要能够通过 LDAP 连接器对 Active Directory 进行修改,您必须通过 SSL 绑定到 LDAP 服务。否则,Active Directory 会提供一个大部分是只读的连接。您无法在没有 LDAPS 的情况下添加对象或修改某些属性,例如,密码只能使用与 Active Directory 的 LDAPS 连接更改。

因此,对于那些希望从 Unix 主机使用 PHP+OpenLDAP+OpenSSL 安全地连接到 Active Directory 的人来说,我自己花了一些时间来实现这一点,并且遇到了一些问题。希望这对像我一样在找不到答案的人来说有所帮助。

确保您使用 OpenSSL 支持编译 OpenLDAP,并且使用 OpenLDAP 和 OpenSSL 编译 PHP。

这为 PHP 提供了使用 ldaps:// 连接所需的内容。

配置 OpenSSL

从 Active Directory 中提取您的根 CA 证书,这可以通过使用证书服务来实现,证书服务是 Windows 2000 Server 的标准组件,但可能默认未安装(通常的添加/删除软件方法在此处有效)。我以 Base64 格式而不是 DER 格式提取了它。

将提取的 CAcert 放置到 openssl 的 certs 文件夹中(例如 /usr/local/ssl/certs)并设置哈希符号链接。这可以通过简单地运行以下命令来轻松完成:

/usr/local/ssl/bin/c_rehash

完成后,您可以通过运行以下命令测试它是否工作:

/usr/local/ssl/bin/openssl verify -verbose -CApath /usr/local/ssl/certs /tmp/exported_cacert.pem

(应该返回:OK)。

配置 OpenLDAP

将以下内容添加到您的 ldap.conf 文件中。
(位于 /usr/local/openldap/etc/openldap/ldap.conf)

#--begin--

# 指示客户端不要请求服务器的证书。
#
# 警告:这将打开服务器进行中间人攻击
# 攻击,不应在生产系统或外部使用
# 测试场景!
#
# 如果您使用此设置,则无需任何其他设置,因为
# 没有请求证书,因此不会进行验证
#
# 有关正确解决方案,请查看 https://andreas.heigl.org/2020/01/31/handle-self-signed-certificates-with-phps-ldap-extension/
TLS_REQCERT never

# 定义 CA 证书的位置
TLS_CACERT /usr/local/ssl/certs/AD_CA_CERT.pem
TLS_CACERTDIR /usr/local/ssl/certs

#--end--

您还需要将相同的设置放在 Apache Web 用户主目录中的名为 .ldaprc 的文件中。

例如。

cp /usr/local/openldap/etc/openldap/ldap.conf ~www/.ldaprc )

然后,您可以测试是否能够从 OpenLDAP 命令工具建立到 Active Directory 的 LDAPS 连接。

/usr/local/openldap/bin/ldapsearch -H "ldaps://adserver.ad.com"

这应该以扩展 LDIF 格式返回一些输出,并指示没有匹配的对象,但这证明连接有效。

您要连接到的服务器的名称很重要。如果您在 "ldaps://" URI 中指定的服务器名称与证书中服务器的名称不匹配,它将像这样抱怨。

ldap_bind: 无法联系 LDAP 服务器 (81)
附加信息: TLS: 主机名与对等证书中的 CN 不匹配

一旦您正确地使用 ldapsearch 工具,PHP 也应该可以工作。

然而,一个重要的注意事项是 Web 用户必须能够找到它的 HOME 文件夹。您必须检查 Apache 是否提供一个 HOME 变量,该变量设置为 Web 用户的主目录,以便 php 能够找到 .ldaprc 文件及其包含的设置。这在 Unix 变体之间可能有所不同,但如果您错过它并且它给您带来困扰,这将是一件简单而愚蠢的事情。只需在 Apache 的 httpd.conf 中使用 SetEnv 指令。

SetEnv HOME /usr/local/www

完成所有这些操作后,您现在可以编写一个简单的连接函数。

function connect_AD()
{
$ldap_server = "ldaps://adserver.ad.com" ;
$ldap_user = "CN=web service account,OU=Service Accounts,DC=ad,DC=com" ;
$ldap_pass = "password" ;

$ad = ldap_connect($ldap_server) ;
ldap_set_option($ad, LDAP_OPT_PROTOCOL_VERSION, 3) ;
$bound = ldap_bind($ad, $ldap_user, $ldap_pass);

return $ad ;
}

您可以选择避免使用 URI 样式的服务器字符串,并使用类似于 ldap_connect("adserver.ad.com", 636) ; 但它可以很好地与 Active Directory 服务器一起使用。

希望这证明有用。
7
harrison at glsan dot com
9 年前
要覆盖 ssl ca 文件,可以在 php 中设置一个环境变量。

我发现将 ca 证书(和中间 ca)保存到名为 ca.pem 的文件中,然后添加

putenv('LDAPTLS_CACERT=./ca.pem');

在 ldap_connect 对我起作用之前。
代码示例
<?php
putenv
('LDAPTLS_CACERT=./ca.pem');
ldap_set_option(NULL, LDAP_OPT_DEBUG_LEVEL, 7);
$l = ldap_connect("ldaps://ldap/");
ldap_set_option($l, LDAP_OPT_PROTOCOL_VERSION, 3);
ldap_bind($l, "cn=apache,dc=example", "xxxxxxx");
echo(
ldap_error($l)."\n");
$s = ldap_search($l, "dc=example", "uid=test");
echo(
ldap_count_entries($l, $s)."\n");
?>
在与 ca.pem 相同目录下的 ca.pem 文件中,我们有我们的 ca
-----BEGIN CERTIFICATE-----
<cert here>
-----END CERTIFICATE-----
2
nateshull at gmail dot com
4 年前
在 WISP 堆栈上实现 LDAPS - Win、IIS、SQL、PHP
PHP 7.0.19

对一些说明有一些问题,我需要 LDAPS 用于即将到来的 Active Directory 更新,该更新将删除不安全的 LDAP 连接。

在 php.ini 中启用 ldap 和 openssl 模块。

还要确保扩展名位于 ext 文件夹中

验证模块是否已加载: phpinfo()

笔记
如果环境变量在代码中设置,则不需要 ldap 或 openssl 配置文件。此外,ca 路径不喜欢路径周围的双引号。

*** 代码示例

<?php
$ldapuser
= "domain\\user";
$ldappass = "Passsword";
$ldapserver = "ldaps://server.domain.com";

// 选项是必需的、从不、允许
// 必需是最安全的,其他选项可能允许中间人攻击
putenv('LDAPTLS_REQCERT=require');

// 告诉 ldap 根 ca 证书在哪里
// 请注意,路径中允许空格,无需转义或引号
// 我没有测试权限,但我认为服务应该有读取权限。
putenv('LDAPTLS_CACERT=C:\\Program Files\\php\\certs\\rootca.pem');

// 测试以确保证书能够读取,路径正确。
echo file_get_contents("LDAPTLS_CACERT=C:\\Program Files\\php\\certs\\rootca.pem");

// 设置调试
ldap_set_option(NULL, LDAP_OPT_DEBUG_LEVEL, 7);

// 连接到 ldap 服务器
$ldapconn = ldap_connect($ldapserver) or die ("Couldn't connect");

// 绑定到 ldap 服务器
$ldapbind = false;
$ldapbind = ldap_bind($ldapconn, $ldapuser, $ldappass);

// 成功或失败的简单视图
if ($ldapbind) {
print(
"\n logged in! \n\n");
} else {
print(
"\n log on failure \n\n");
}
?>
2
peter dot burden at gmail dot com
15 年前
主机名参数可以是空格分隔的主机名列表。这意味着如果主服务器不可用,LDAP 代码将与备份服务器通信。在代码超时尝试与主服务器通信时会有一段延迟,但事情仍然可以正常工作。这在典型的 Microsoft Active Directory 设置(主域控制器和备份域控制器)中特别有用。
<?php
$ldaphost
= "192.168.0.100 192.168.0.101";
$ldapconn = ldap_connect($ldaphost);
?>
1
blizzards at libero dot it
19 年前
要完成有关如何使用端口 636 上的 SASL 连接到 LDAP ACTIVE DIRECTORY 2000/2003 服务器的问题,您可以参考以前的注释以及以下指令

A) 从 AD 创建 CA 证书;
B) 导出为 .pem(DER)格式;
C) 安装 OPENSSL、CYRUS SASL、OPENLDAP、KERBEROS 5;
D) 将导出的 AD ca 证书复制到您的 unix 系统上的 openssl 证书目录中;
E) 使用 c_reash 命令重新访问;
F) 从 AD 获取您的用户的 kerberos 票证;
G) 使用 SSL 和 LDAP 支持编译 PHP;
H) 使用 ldapsearch -D <binddn> -W -H ldaps://ad.secure.com:636 -x 测试

如果一切正常,请创建您的 php 脚本。

注意: 为了将参数写入 AD,您需要每 10 小时或更短时间(AD 默认票证生命周期)更新一次票证,为了读取目的,您可以保留已过期的票证。
查询 Windows 2000/2003 AD 时,您**必须**仅使用 SASL,而不是 TLS(不支持)。
2
mwilmes at avc dot edu
9 年前
我支持使用 PHP-FPM 在 CentOS 7 上运行的 LAMP 堆栈,该堆栈需要通过 SSL 连接到 Active Directory。我们有域的根证书。我能够在五个步骤中完成此设置。

1. 以 base64 格式获取域的根 SSL 证书。(必须是企业管理员 - 如果您不是,请与您的管理员联系。)
运行 mmc.exe
文件 -> 添加/删除管理单元
选择证书颁发机构,然后选择为您的域生成证书的服务器。
展开树,直到找到根证书的条目,然后右键单击 -> 属性。
单击 "查看证书" 按钮,"详细信息" 选项卡,然后单击 "复制到文件..." 按钮。
使用向导将根证书导出到您的计算机。确保您使用 Base-64 格式。

2. 将根证书复制到 Linux 服务器。您可以在记事本中打开证书,并将内容复制粘贴。

3. 将证书转换为 pem 格式。根据需要替换文件名。
openssl x509 -in <copied certificate file> -out /etc/openldap/certs/<cert>.pem

4. 在 ldap.conf 中添加一行以使用新的根证书。
vi /etc/openldap/ldap.conf
TLS_CACERT /etc/openldap/certs/<cert>.pem

5. 重新启动 PHP 服务。
systemctl restart php-fpm.service
2
avel at noc uoa gr
22 年前
请注意,主机名可以是空格分隔的 LDAP 主机名列表。这对于故障转移非常有用;如果第一个 ldap 主机宕机,ldap_connect 将询问第二个 LDAP 主机。当然,在执行此操作之前,您_必须_拥有 LDAP 复制。:) 阅读 LDAP API 文档以了解更多信息。

除了故障转移之外,这对于 LDAP 负载均衡也很有用。只需使用一个随机生成器函数,它将在每次调用时返回一个不同的空格分隔列表。这是因为列表中的第一个主机总是先被尝试。

在执行 LDAP 写入操作时要小心;确保在要修改数据库时始终连接到主主机,以便副本按预期获得更改。

Alexandros Vellis
1
Nixahnung
9 年前
我花了很多时间尝试建立到 MS AD 全局目录端口 3269 的 LDAPS 连接

我的五分钱

ldap_connect("ldaps://example.com", 3269)
=> 连接到 636.... :(,仅 DC

ldap_connect("ldaps://example.com:3269")
=> 连接到 3269.... :), 正如预期的那样 GC

希望它能有所帮助...
1
allie at lsu dot edu
17 年前
我真希望有一个方法可以让全世界所有程序员都知道如何绑定和搜索MS AD。这是我第二次遇到“我需要搜索整个树”的问题。

对于php(和apache auth_ldap),你需要指定端口3268,才能搜索整个树。否则,它会输出部分结果错误。

ldap_connect($server,3268);

我幸运地赢得了与apache搜索整个目录的同一场战斗。当我发现我们的php应用程序无法对用户进行身份验证时,我立即通过添加端口规范(和ldap_set_option($ldapserver, LDAP_OPT_REFERRALS, 0)选项)解决了这个问题。

我真的希望这能帮助其他人,在他们扯光头发之前。我知道我以前就经历过这种痛苦。
0
heiglandreas at php dot net
5个月前
如果你在使用ldap-conjnect时遇到TLS问题:尽管很多人说TLS_REQCERT=never是永远不会正确的答案。

查看https://andreas.heigl.org/2020/01/31/handle-self-signed-certificates-with-phps-ldap-extension/,了解如何使用正确的证书检查来解决这个问题!
0
titanrat at bk dot ru
7年前
我在php7.0和php5.5的这个函数中发现了一些区别

Php5 ldap_connect ('host', 0) 尝试连接默认端口 - host:389
Php7 ldap_connect ('host', 0) 尝试连接host:0 并且崩溃。
0
antoine dot php dot net at bonnefoy dot eu
8年前
你好,

对nemanja的帖子做一些小修正。
- 如果连接被防火墙拒绝,会有警告(在fsockopen之前添加@)
- fclose参数不正确。

使用这种方法,你可以获得一个非常好的故障转移功能,例如,一家拥有数十个DC的公司分布在不同的地方,这样你的PHP程序将始终具有高可用性,只要至少有一个DC目前处于活动状态。
<?php
function serviceping($_host, $_port = 389, $_timeout = 1) {
$op = @fsockopen($_host, $_port, $errno, $errstr, $_timeout);
if (!
$op) {
echo
"KO!";
return
0;

}
//DC is N/A
else {
fclose($op); //explicitly close open socket connection
return 1; //DC is up & running, we can safely connect with ldap_connect
}
}

function
ldap_connect_failover($_domain) {
// ##### STATIC DC LIST, if your DNS round robin is not setup
//$dclist = array('10.111.222.111', '10.111.222.100', '10.111.222.200');
// ##### DYNAMIC DC LIST, reverse DNS lookup sorted by round-robin result
$dclist = gethostbynamel($_domain);

foreach (
$dclist as $dc) {
if (
serviceping($dc) == true) {
break;
} else {
$dc = 0;
}
}
//after this loop, either there will be at least one DC which is available at present, or $dc would return bool false while the next line stops program from further execution

if (!$dc) {
return
false;
}
//user being notified

return ldap_connect($dc);
}
?>
0
TheThinkingMan
9 年前
我花了几个小时试图让我的本地AD LDS实例(运行在Windows 8.1 64位上)建立LDAPS连接。

我尝试了各种证书。OpenSSL、Thawte和自签名证书,但都没有成功。

我最终删除了所有证书,并使用IIS 7(运行在Windows 8.1上)创建了一个自签名证书。

然后,我下载了Softerra LDAP浏览器,它能够通过SSL毫无问题地连接到我的AD LDS实例。

如果Softerra LDAP浏览器可以连接,PHP肯定也可以。

我使用以下代码连接
<?php
$ldap_server
= "ldaps://delllappy:636";
$ldap_conn = ldap_connect($ldap_server) or die("Failed to connect to LDAP server.");
?>
我在ldap_connect之前添加了以下代码
<?php
putenv
('LDAPTLS_REQCERT=allow');
putenv("LDAPCONF=C:\OpenLDAP\sysconf\ldap.conf");
?>

这些代码没有起到作用。

我使用的ldap_bind命令是
<?php
if (!ldap_bind($ldap_conn, $ldap_user, $ldap_pass)) {
echo
"error";
}else{
echo
"success";
}
?>
顺便说一下:我在代码中添加了大量的调试信息,这些信息在其他地方有参考,所以我没有在这里添加。

我一直在遇到的错误是
Error Binding to LDAP: error:14090086:SSL routines:SSL3_GET_SERVER_CERTIFICATE:certificate verify failed

然后我运行了ProcMon(来自微软的进程监视器)。

我监控了重启web服务器(Z-WAMP)时的情况。在那时,没有尝试读取ldap.conf。

然后,我加载了包含我的test.php文件的网页。

在那时,我注意到它读取的是ldap.conf,而不是openldap.conf。

当然,因为我的文件名为ldap.conf,openldap.conf失败了。我将我的ldap.conf重命名为openldap.conf,一切正常。

在运行OpenLDAP的Z-WAMP上,不要使用ldap.conf,而要使用openldap.conf。

openldap.conf文件被放置在C:\openldap\sysconf\。

由于PUTENV的值没有起到作用,我删除了它们。
0
ac dot russell at live dot com
11年前
为了通过ssl连接到ldap服务器,我需要使用证书。为了使这工作,ldap管理员给我发送了一个.der文件,我把它放在/etc/openldap/cacerts中。
cp ldap-server.der /etc/openldap/cacerts
该目录必须chmod 755。然后,以下条目必须在/etc/openldap/ldap.conf中

# 使连接容易受到MITM攻击
# 通过不检查任何证书
# 为了更好的解决方案,请查看https://andreas.heigl.org/2020/01/31/handle-self-signed-certificates-with-phps-ldap-extension/
TLS_REQCERT never
TLS_CACERTDIR /etc/openldap/cacerts
"TLS_REQCERT never" 应该只在证书链中存在自签名证书时才需要。
0
csnyder at fcny dot org
15 年前
值得重复的是(并且示例可能应该更新),ldap_connect() 实际上并没有测试与指定ldap服务器的连接。如果你试图在基于ldap的身份验证例程中构建故障转移,这一点非常重要。

测试连接的唯一方法是实际调用 ldap_bind( $ds, $username, $password )。但如果失败,是用户名/密码错误,还是连接断开?据我所知,没有办法判断。

似乎,如果ldap_bind() 对主服务器失败,你除了尝试使用相同的凭据对备份服务器进行ldap_bind() 外别无选择。然而,如果你的组织限制了失败的登录尝试次数,一个错误的密码会被计为两次失败的登录尝试。这不好。

一种可能的解决方法是首先尝试匿名绑定

<?php
// 连接到主服务器
$ds = ldap_connect( 'ldap://10.0.0.7/' );
// 注意:即使主服务器关闭,$ds 始终是一个资源

// 尝试匿名登录以测试连接
$anon = @ldap_bind( $ds );
if ( !
$anon ) {
// 测试失败,连接到故障转移主机
$ds = ldap_connect( 'ldap://10.0.0.8/' );
}
else {
// 测试通过,解除匿名绑定并重新连接到主服务器
ldap_unbind( $ds );
$ds = ldap_connect( 'ldap://10.0.0.7/' );
}

// 现在尝试真正的登录
$login = @ldap_bind( $ds, $username, $password );
?>

请注意,此解决方法依赖于匿名登录的启用,这可能并不总是可行。令人遗憾的是,没有其他方法可以测试连接。希望这一点能够在将来对ldap_connect() 的某个实现中得到改进。
0
geigers at binghamton dot edu
16年前
如果你有oci8并且正在尝试使用openldap作为ldap,你可能会遇到问题。我有一个Oracle数据库,我从apache连接到它。Oracle也拥有ldap库,这些库优先于openldap库。这会导致在使用uri样式连接字符串调用ldap_connect时出现段错误;例如ldap_connect("ldaps://myldapserver.host");

在使用gdb调试核心转储并进行大量谷歌搜索后,我发现解决方案是在apachectl启动时添加一个环境变量。

我使用的是在RHEL上的Apache 2.2.8和PHP 5.2.5。我添加了

LD_PRELOAD=/path/to/libldap.so
export LD_PRELOAD

在/usr/sbin/envvars中,该文件在apachectl启动时被读取。你可以在以下位置了解更多信息:http://www.mail-archive.com/[email protected]/msg02201.html

Scott Geiger
0
bleathem at gmail dot com
16年前
每个人都在发布关于在WAMP/AD堆栈中让ldaps://工作的信息,我在RHEL 5.1(使用所有标准rpm)中很难找到如何让它运行。老式的strace派上用场,帮助我找到了问题所在...

事实证明,php正在/etc/pki/CA中查找CA文件,而我没有对该文件夹设置正确的权限。将它chmod到755解决了我的“无法联系LDAP服务器”信息。
0
andreas dot a dot sandberg at gmail dot com
17 年前
在使用与 Solaris 捆绑在一起的 sun 客户端库的 ldap_connect 时要小心。当使用 ldap 协议指定主机时,我的连接失败,我花了一整天的时间才排查故障。例如:ldap_connect("ldap://somwhere.com"); 只需删除“ldap://”并指定主机即可。这是在 Solaris 10 sparc 上。
0
elsint at yahoo dot com
17 年前
如果您使用的是 Windows,请注意证书的权限。

将证书的权限设置为所有人可读和可读执行,否则您可能会因为此问题而遇到绑定错误。
0
Srivathsa M
19 年前
在 NetWare 上使用 LDAP over SSL

1. 将服务器证书复制到 sys:/php5/cert 目录。此位置在 php.ini 文件中可配置。

2. 在 ldap_connect 调用中,使用“ldaps://”作为主机名参数的前缀,或使用 636 作为端口号参数。

有关更多详细信息,请访问 NetWare 特定的 PHP 文档:http://developer.novell.com/ndk/doc/php/index.html
0
nigelf at esp dot co dot uk
19 年前
如上所述,openLDAP 始终会返回一个资源,即使服务器名称无效。

如果您随后使用错误抑制 (@ldap_bind) 绑定并且失败,则无法确定失败的原因(即:连接或凭据)。由于绑定不返回资源,因此您也无法从 ldap_error 等获取最后一个错误。

如果您只向用户显示有关登录失败的消息,他们可能会因为重新输入有效的用户名/密码而感到沮丧,因为是连接出了问题。
-1
vandervoord at planet dot nl
17 年前
关于搜索整个 AD 树的先前说明完全适用。但是,您必须确保您正在进行身份验证/搜索的服务器是全局目录服务器。如果不是,连接和绑定将失败。通常您的域中至少有一台全局目录服务器,因此如果连接失败,请尝试其他服务器,它将起作用。它能够起作用的原因是全局目录服务器会搜索整个域,而域目录只搜索给定的 OU,当然这也构成了安全威胁 :)...
-1
Anonymous
22 年前
使用 URL 作为主机参数时,始终会返回一个资源 ID
即使主机不存在。

“当使用 URI 描述连接时,(open)ldap 库
只解析 url 并检查其是否有效,_不会建立连接_
在这种情况下。”
[email protected]
http://bugs.php.net/bug.php?id=15637
-2
mharting at micahtek dot com
14 年前
在尝试设置故障转移方面的补充。在执行 ldap_connect 后,执行 ldap_bind。如果 ldap_bind 失败,请使用命令 ldap_errno 获取错误号。如果错误号为 81,则表示服务器已关闭。这是我们唯一对备用 ldap 服务器进行故障转移的时候。

另一个要考虑的事情是错误可能是 49,然后执行
ldap_get_option($this->ds,LDAP_OPT_ERROR_NUMBER,$optErrorNumber);。这将返回扩展数据,如果该数据代码为 532 或 773,则绑定失败将是由密码过期导致的,需要更新密码才能成功绑定。
-6
baroque at citromail dot hu
18 年前
此代码示例演示了如何使用 LDAP 在 PHP 中连接到 eDirectory 并绑定到 Netware。

<?php

$server
='137.65.138.159';
$admin='cn=admin,o=novell';
$passwd='novell';

$ds=ldap_connect($server); // 假设 LDAP 服务器位于此主机上

if ($ds) {
// 使用适当的 dn 绑定以授予更新访问权限
$r=ldap_bind($ds, $admin, $passwd);
if(!
$r) die("ldap_bind failed<br>");

echo
"ldap_bind success";
ldap_close($ds);
} else {
echo
"Unable to connect to LDAP server";
}
?>
-4
verikono
13 年前
PHP:LDAP 不支持持久连接。
-14
miki at qex dot cz
14 年前
我在“无法绑定到服务器:无效凭据”错误方面遇到了严重问题 - 一切似乎都正常(登录/密码在其他应用程序中使用)。
通过在登录中添加域(不是“用户名”,而是使用“[email protected]”)解决了此问题。
To Top