如何在PHP中使用受信任域的凭据绑定到AD服务器


How to bind to AD server in PHP with credentials from trusted domain?

我们有几个AD服务器,它们之间建立了森林信任,因此来自不同域的Windows用户能够访问受限制的资源。假设我们有domainA.com和domainB.com,那么domainB.com域的任何用户都可以登录到domainA.com上的资源。出于安全考虑,管理员禁止匿名访问LDAP服务器。

现在我们需要在OpenLDAP客户机的帮助下在PHP代码中列出来自所有LDAP服务器的所有用户。下面是从domainB.com获取所有用户信息的PHP代码

define('USER', 'user@domainA.com'); // User from domainA.com here
$ldap = ldap_connect('domainB.com') or die('Bad connection');
ldap_set_option($ldap, LDAP_OPT_PROTOCOL_VERSION, 3);
ldap_set_option($ldap, LDAP_OPT_REFERRALS, 0);
ldap_bind($ldap, USER, PASS) or die('Cannot bind');

我的脚本死亡消息"Cannot bind" with ldap error "49 Invalid credentials"。来自AD的附加信息:
80090308: ldper: DSID-0C0903A9,注释:AcceptSecurityContext error, data 52e, v1db1

我认为问题在于简单的身份验证机制,因为当我在Ldap管理员客户端中使用GSS协商身份验证时,对于user@domainA.com具有相同的凭据,一切正常。

我能做些什么来成功绑定domainB.com与凭据从user@domainA.com?

UPD1 Authentication with SASL DIGEST-MD5

ldap_sasl_bind ( $ldap, '', $pass, 'DIGEST-MD5', null, 'user@domainA.com');

AD日志:

<>之前计算机试图验证帐户的凭据。认证包:WDigest登录帐号:用户源工作站:DOMAINA错误码:0xc000006a帐户登录失败。主题:安全ID:空SID帐户名称:-帐户域:-登录ID: 0x0登录类型:3登录失败的帐户:安全ID:空SID帐户名称:user@domainA.com帐号域:domainA.com故障信息:失败原因:登录时发生错误。状态 : 0 xc000006d子状态:0xc000006d处理信息:主叫进程ID: 0x0调用方进程名称:-网络信息:工作站名称:-源网络地址:源端口:详细认证信息:登录过程:WDIGEST认证包:WDigest过境服务:-包名(仅限NTLM): -密钥长度:0当登录请求失败时生成此事件。它在试图访问的计算机上生成。Subject字段指示请求登录的本地系统上的帐户。这通常是一个服务,如Server服务,或一个本地进程,如Winlogon.exe或Services.exe。"登录类型"字段指示所请求的登录类型。最常见的类型是2(交互式)和3(网络)。Process Information字段指示系统上的哪个帐户和进程请求登录。Network Information字段指示远程登录请求的起源位置。工作站名称并非总是可用,在某些情况下可能留空。身份验证信息字段提供有关此特定登录请求的详细信息。-中转服务指示哪些中间服务参与了此登录请求。—包名表示在NTLM协议中使用的是哪一个子协议。

我在配置Moodle时遇到过这个问题,它使用PHP LDAP库和OpenLDAP连接到AD服务器。解决方案非常简单,两件事之一(实际上归结为一件事):

  1. 使用未限定范围的用户名(即用户名后面没有'@example.com')
  2. 使用域名'用户名
基本上,它归结为一件事是获得正确的,预期的用户名语法。我认为这取决于特定的AD配置,因为我在各种AD服务器上看到了四种类型的用户名:完整DN,范围内的用户名(即看起来像电子邮件地址),DOMAIN'用户名和普通用户名。

当您在ldap_bind中指定用户时,您可以尝试这样放置您的用户DN:

$bind = ldap_bind($resource, 'cn=jpb,cn=users,dc=dom,dc=fr', '***'); 

另一件事,在你的'活动目录森林'你有一个或多个域控制器支持一个名为'全局目录' (GC)的目录。GC包含林中所有目录的所有对象。


编辑您可以尝试绑定SASL

$ldap = ldap_connect('domainB.com');
ldap_set_option($ldap, LDAP_OPT_PROTOCOL_VERSION, 3);
ldap_set_option($ldap, LDAP_OPT_REFERRALS, 0); 
ldap_sasl_bind ( $conn, NULL,"password",'DIGEST-MD5',NULL,'user@domainA.com',NULL);