我可以通过编程方式确定ldap_bind是否因网络问题而失败?

时间:2012-04-10 21:00:34

标签: php ldap

我们使用LDAP服务器对用户进行身份验证。由于服务器是远程访问的,因此我们的网络服务器将处于联机状态的可能性相当高,并且LDAP服务器将关闭进行维护。

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

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

2 个答案:

答案 0 :(得分:3)

答案 1 :(得分:0)

请求/响应框架

LDAP交互包括请求和响应。响应将始终包含结果 码。当请求是绑定时,非零结果代码表示发生了错误 例如,结果代码decimal 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客户端工作。

另见