我能否以编程方式确定ldap_bind是否由于网络问题而失败


Can I programmatically determine if ldap_bind fails because of a network issue?

我们使用LDAP服务器来验证我们的用户。由于服务器是远程访问的,因此我们的网络服务器将在线并且LDAP服务器将关闭以进行维护的可能性相当高。

现在,当ldap_bind失败时,我假设这是用户身份验证问题(错误的用户名/密码),并向用户显示一条消息。但是,如果与LDAP服务器的连接失败(并且不一定是凭据问题),那么我最终会遇到数百名用户告诉我,当这不是问题时,他们的密码不起作用。

我怎样才能从中恢复? ldap_connect似乎在所有情况下都成功,因为连接被推迟到调用ldap_bind。ldap_bind的返回值是一个简单的布尔值,虽然 PHP 显示的警告消息提供了信息,但这对我的代码没有太大帮助。

使用 ldap_errno()

http://php.net/manual/en/function.ldap-errno.php

可能的错误代码列表:http://www.php.net/manual/en/function.ldap-errno.php#20665

请求/响应框架

LDAP 交互由请求和响应组成。响应将始终包含结果法典。当请求是绑定时,非零结果代码表示发生了错误,对于例如,结果代码十进制49指示提供的凭据不正确(在在某些情况下,出于安全原因,当条目不存在时,可以返回此结果代码为了误导攻击者)。应用程序编码人员应验证与服务器可以成功,并且绑定可分辨名称具有正确的凭据:使用已知的正确工具(如 ldapsearch )进行认证。例如,尝试:

ldapsearch -h hostname -p port '
   -D distinguished-name-here -w <password> -b '' -s base '(&)' 

上述搜索建立连接,将连接的授权状态更改为使用给定凭据指定的身份验证 ID,然后从根检索属性DSE。如果此搜索成功,则可以确保应用程序编码人员凭据正确。

网络超时

应用程序编码人员应始终使用支持网络超时概念的 API由于超时不是 LDAP 协议的一部分 - 搜索有时间限制(请参阅RFC4511),但协议中没有网络超时。如果 LDAP API 不支持网络超时,则不应考虑该 API非平凡的 LDAP 客户端工作。

参见

  • LDAP:编程实践