我们使用LDAP服务器对用户进行身份验证。由于服务器是远程访问的,因此我们的网络服务器将处于联机状态的可能性相当高,并且LDAP服务器将关闭进行维护。
现在,当ldap_bind失败时,我认为这是用户身份验证问题(用户名/密码错误),我向用户显示一条消息。但是,如果与LDAP服务器的连接失败(并且它不一定是凭据问题),那么我最终会有数百个用户告诉我,如果不是问题,他们的密码就不起作用。
我该如何从中恢复? ldap_connect似乎在所有情况下都成功,因为连接被推迟到调用ldap_bind之前。 ldap_bind的返回值是一个简单的布尔值,虽然PHP显示的警告消息是提供信息的,但这对我的代码没有多大帮助。
答案 0 :(得分:3)
使用ldap_errno()
。
http://php.net/manual/en/function.ldap-errno.php
可能的错误代码列表:http://www.php.net/manual/en/function.ldap-errno.php#20665
答案 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客户端工作。