【发布时间】:2011-09-30 09:10:37
【问题描述】:
我们有多个 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');
我的脚本因 ldap 错误“49 无效凭据”消息“无法绑定”而终止。来自 AD 的附加信息:
80090308:LdapErr:DSID-0C0903A9,注释:AcceptSecurityContext 错误,数据 52e,v1db1
我认为问题出在简单的身份验证机制上,因为当我在 Ldap Administrator 客户端中使用 GSS 协商身份验证时,使用与 user@domainA.com 相同的凭据,一切正常。
如何使用来自 user@domainA.com 的凭据在 domainB.com 上成功绑定?
UPD1 使用 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 故障信息: 失败原因:登录时出错。 状态:0xc000006d 子状态:0xc000006d 处理信息: 调用方进程 ID:0x0 调用者进程名称:- 网络信息: 工作站名称:- 源网络地址: 源端口: 详细的认证信息: 登录过程:WDIGEST 身份验证包:WDigest 过境服务:- 包名称(仅限 NTLM):- 密钥长度:0 当登录请求失败时会生成此事件。它是在尝试访问的计算机上生成的。 主题字段指示请求登录的本地系统上的帐户。这通常是服务器服务等服务,或 Winlogon.exe 或 Services.exe 等本地进程。 登录类型字段指示所请求的登录类型。最常见的类型是 2(交互式)和 3(网络)。 进程信息字段指示系统上的哪个帐户和进程请求登录。 网络信息字段指示远程登录请求的来源。工作站名称并非始终可用,在某些情况下可能留空。 身份验证信息字段提供有关此特定登录请求的详细信息。 - 中转服务指示哪些中间服务参与了此登录请求。 - 包名称表示在 NTLM 协议中使用了哪个子协议。【问题讨论】:
标签: php authentication active-directory ldap trust