使用LDAP和PHP获取AD错误数(ldap函数返回不准确错误)

Joh*_*ler 2 php ldap active-directory

我正在创建一个使用PHP连接到Active Directory(AD)的应用程序,使用LDAP协议.

工作正常,我的问题是如果登录操作失败,如何捕获特定的错误.今天,应用程序仅显示登录是否有效,例如:假设用户名在AD中过期,系统将显示"用户名/密码无效",因为我们不验证LDAP的特定返回.

好吧,让我们回到问题本身,下面是我希望捕获特定错误的代码.

<?php
if (! ($bind = @ldap_bind ( $connect, "DOMAIN\\" . strtoupper ( $this->user), $this->password))) {
            error_log ( "Autentication fails LDAP (user: $this->user)" );

            return ldap_errno ( $connect );
?>
Run Code Online (Sandbox Code Playgroud)

该函数ldap_errno根据此表返回发生的事件的数量:

(还有更多,见下面的链接)

48 LDAP_INAPPROPRIATE_AUTH 49 LDAP_INVALID_CREDENTIALS
49/52E AD_INVALID CREDENTIALS
五百二十五分之四十九未找到用户
530分之49NOT_PERMITTED_TO_LOGON_AT_THIS_TIME531分之49RESTRICTED_TO_SPECIFIC_MACHINES532分之49PASSWORD_EXPIRED
533分之49ACCOUNT_DISABLED
568分之49ERROR_TOO_MANY_CONTEXT_IDS
七百○一分之四十九ACCOUNT_EXPIRED七百七十三分之四十九用户必须复位PASSWORD
50 LDAP_INSUFFICIENT_ACCESS

http://wiki.servicenow.com/index.php?title=LDAP_Error_Codes

好吧,问题是PHP总是只返回49(LDAP_INVALID_CREDENTIALS),与情况无关(与登录有关系的情况).例如,如果我的帐户过期,PHP返回49,我想要返回49/701,我怎么能找到701?是另一个功能?

如果他的密码或他的用户名无效,我如何向用户显示,而不是两者兼而有之?我知道这是一个安全点,表明两者都是无效的,但我们认为更好地显示错误,如果用户名或if是密码,可以用LDAP知道吗?

PHP版本5.4.31

编辑

我发现了一个有用的问题:

https://bugs.php.net/bug.php?id=47222

任何人都知道如何以这种方式做一个ldap_search:

ldapsearch -x -H ldap://der-ad-server.de:389 -D accountname@der-ad-server.de -W 
Run Code Online (Sandbox Code Playgroud)

我不知道如何用PHP ldap_search()函数进行搜索

Joh*_*ler 10

花了很多时间在搜索中我找到了解决方案!

我在此页面中创建了:http: //php.net/manual/en/function.ldap-get-option.php

基本上你必须定义一个名为LDAP_OPT_DIAGNOSTIC_MESSAGE的新常量变量

像这样

define('LDAP_OPT_DIAGNOSTIC_MESSAGE', 0x0032);
Run Code Online (Sandbox Code Playgroud)

然后

ldap_get_option($conn, LDAP_OPT_DIAGNOSTIC_MESSAGE, $extended_error);
Run Code Online (Sandbox Code Playgroud)

有了它,LDAP将为您提供扩展错误,您将能够知道实际发生了什么,该值将放在$ extended_error中.

  • 为什么这没有被投入太空? (3认同)