使用 LDAP 和 PHP 获取 AD 错误数(ldap 函数 return 不精确错误)
Get number of AD errors with LDAP and PHP (ldap function return unprecise error)
我正在制作一个应用程序,使用 PHP 使用 LDAP 协议连接到 Active Directory (AD)。
工作正常,我的问题是如果登录操作失败如何捕获特定错误。今天,应用程序只显示登录是否有效,例如:假设用户名在 AD 中已过期,系统将显示 "username/password is invalid" 因为我们不验证 LDAP 的特定 return .
好的,让我们回到问题本身,下面是我希望捕获特定错误的代码。
<?php
if (! ($bind = @ldap_bind ( $connect, "DOMAIN\" . strtoupper ( $this->user), $this->password))) {
error_log ( "Autentication fails LDAP (user: $this->user)" );
return ldap_errno ( $connect );
?>
那个函数,ldap_errno,return告诉我发生了什么,基于这个 table:
(还有更多,见下文link)
48 LDAP_INAPPROPRIATE_AUTH
49LDAP_INVALID_CREDENTIALS
49 / 52e AD_INVALID 证书
49 / 525 未找到用户
49 / 530 NOT_PERMITTED_TO_LOGON_AT_THIS_TIME
49 / 531 RESTRICTED_TO_SPECIFIC_MACHINES
49 / 532 PASSWORD_EXPIRED
49 / 533 ACCOUNT_DISABLED
49 / 568 ERROR_TOO_MANY_CONTEXT_IDS
49 / 701 ACCOUNT_EXPIRED
49 / 773 用户必须重置密码
50 LDAP_INSUFFICIENT_ACCESS
http://wiki.servicenow.com/index.php?title=LDAP_Error_Codes
好的,问题是PHP return我总是只有49(LDAP_INVALID_CREDENTIALS),与情况无关(与登录有关的情况)。例如,如果我的帐户已过期,PHP return 给我 49,我想要 return 49 / 701,我如何找到 701?是另一个函数吗?
如果他的密码或他的用户名无效,我如何向用户显示,而不是两者?我知道显示两者都无效是为了安全起见,但我们决定最好显示错误是什么,如果用户名或密码,是否可以通过 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
我不知道如何使用 PHP ldap_search()
函数进行搜索
经过大量搜索,我找到了解决方案!
我在这个页面创建了:
http://php.net/manual/en/function.ldap-get-option.php
基本上你必须定义一个名为 LDAP_OPT_DIAGNOSTIC_MESSAGE
的新常量变量
像这样
define('LDAP_OPT_DIAGNOSTIC_MESSAGE', 0x0032);
然后
ldap_get_option($conn, LDAP_OPT_DIAGNOSTIC_MESSAGE, $extended_error);
有了它,LDAP 会给你扩展错误,你将能够知道到底发生了什么,值将被放入 $extended_error.
我正在制作一个应用程序,使用 PHP 使用 LDAP 协议连接到 Active Directory (AD)。
工作正常,我的问题是如果登录操作失败如何捕获特定错误。今天,应用程序只显示登录是否有效,例如:假设用户名在 AD 中已过期,系统将显示 "username/password is invalid" 因为我们不验证 LDAP 的特定 return .
好的,让我们回到问题本身,下面是我希望捕获特定错误的代码。
<?php
if (! ($bind = @ldap_bind ( $connect, "DOMAIN\" . strtoupper ( $this->user), $this->password))) {
error_log ( "Autentication fails LDAP (user: $this->user)" );
return ldap_errno ( $connect );
?>
那个函数,ldap_errno,return告诉我发生了什么,基于这个 table:
(还有更多,见下文link)
48 LDAP_INAPPROPRIATE_AUTH
49LDAP_INVALID_CREDENTIALS
49 / 52e AD_INVALID 证书
49 / 525 未找到用户
49 / 530 NOT_PERMITTED_TO_LOGON_AT_THIS_TIME
49 / 531 RESTRICTED_TO_SPECIFIC_MACHINES
49 / 532 PASSWORD_EXPIRED
49 / 533 ACCOUNT_DISABLED
49 / 568 ERROR_TOO_MANY_CONTEXT_IDS
49 / 701 ACCOUNT_EXPIRED
49 / 773 用户必须重置密码
50 LDAP_INSUFFICIENT_ACCESS
http://wiki.servicenow.com/index.php?title=LDAP_Error_Codes
好的,问题是PHP return我总是只有49(LDAP_INVALID_CREDENTIALS),与情况无关(与登录有关的情况)。例如,如果我的帐户已过期,PHP return 给我 49,我想要 return 49 / 701,我如何找到 701?是另一个函数吗?
如果他的密码或他的用户名无效,我如何向用户显示,而不是两者?我知道显示两者都无效是为了安全起见,但我们决定最好显示错误是什么,如果用户名或密码,是否可以通过 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
我不知道如何使用 PHP ldap_search()
函数进行搜索
经过大量搜索,我找到了解决方案!
我在这个页面创建了: http://php.net/manual/en/function.ldap-get-option.php
基本上你必须定义一个名为 LDAP_OPT_DIAGNOSTIC_MESSAGE
的新常量变量像这样
define('LDAP_OPT_DIAGNOSTIC_MESSAGE', 0x0032);
然后
ldap_get_option($conn, LDAP_OPT_DIAGNOSTIC_MESSAGE, $extended_error);
有了它,LDAP 会给你扩展错误,你将能够知道到底发生了什么,值将被放入 $extended_error.