6

我的应用程序通过 LDAP(通常是 Active Directory)定义授权用户:

  1. 客户定义了一个 LDAP 服务器 (TreeA) 和一个组 (GroupA)。GroupA 中的任何用户都可以使用该应用程序。
  2. 在登录时,用户发送他们的用户名和密码——如果使用他们的凭据绑定到 LDAP TreeA 有效,并且他们的用户帐户在 GroupA 中,那么他们很高兴

我遇到过两个 Active Directory 相互信任的情况,并且 TreeA 中指定的 GroupA 包含来自 TreeB 的用户。所以第 2 步失败了,因为我正在尝试针对 TreeA 对 UserB(来自 TreeB)进行身份验证。

该应用程序可以访问 TreeA,所以我想它可以查看 GroupA 并在那里看到 UserB。但是它怎么知道它需要向 TreeB 发送绑定请求来验证用户名和密码呢?

有没有更好的方法来解决这个问题?
由于存在信任关系,因此对 TreeA 的此类绑定请求是否应该自动转发给 TreeB?

4

4 回答 4

1

可能是您在 LDAP 服务器 (TreeA) 上遇到了配置问题。您写道,TreeA 和 TreeB 之间存在信任,因此您可以将 UserB(来自 TreeB)添加为 TreeA 中 GroupA 的成员。如果你能做到这一点,那么你已经成功地在 TreeA 和 TreeB 之间建立了正确方向的信任。您应该理解,这种信任仅意味着 Active Directory B 仅验证用户密码,但默认情况下 UserB 将无权访问 Active Directory A 中的任何资源。 UserB 无权将 LDAP 绑定到服务器 A。在这种情况下,问题将通过授予 UserB 对服务器 A 的远程登录权限和对 GroupA 的读取权限以及可能对 GroupA 所在的 OU 的读取权限来解决。您可以尝试Insight for Active Directory监控 AD 访问以定位权限问题。

您的问题的其他可能原因可能是您用于 LDAP 访问的 API 的使用。在您的问题中,您没有写任何有关 API 的信息。您是使用ldap_bind_s 之类的 Win32 API 还是在 .NET 中使用DirectoryEntry ?在这两种情况下,重要的是您要么在绑定期间显式使用域名和帐户名(对于 UserB),要么null同时使用用户当前用户凭据的名称和密码。

使用来自 TreeA 的固定帐户对 TreeA 的所有访问(也用于对 UserB 的测试)也可以解决问题,但它可能只是某种应用程序使用。

无论如何,您的问题中的更多信息可以缩小问题和解决问题的方法。

于 2011-02-23T14:08:55.457 回答
0

也许您应该使用 ldap 复制,以便对象始终存在于两个服务器中?

于 2011-02-22T15:40:42.140 回答
0

该应用程序可以访问 TreeA,所以我想它可以查看 GroupA 并在那里看到 UserB。但是它怎么知道它需要向 TreeB 发送绑定请求来验证用户名和密码呢?

GroupA 中的member属性将给出每个成员的完整专有名称 (dn),可能类似于:

member: CN=User1,OU=People,DC=TreeA,DC=foobar,DC=com
member: CN=User2,OU=People,DC=TreeB,DC=foobar,DC=com

因此,当“User2”尝试进行身份验证时,您可以匹配 CN 并知道您应该针对“TreeB”而不是“TreeA”进行身份验证。(大概你会有某种表将 DN 映射到 AD 服务器主机名。)或者,如果你从“TreeA”得到一个“没有这样的用户”,你只是暴力破解它并尝试“TreeB”。

您需要决定如何处理两棵树中重复用户名的情况——其中一个是否优先于另一个?

另一种方法是要求用户指定他们正在验证的树,例如使用“user1@treea.foobar.com”之类的登录名登录。

于 2011-02-22T16:13:19.667 回答
0

假设您有相互信任的域 A 和域 B,如果您想在域 A 的服务器上针对域 A 对域 B 中的用户 B 进行身份验证,那么您必须做的是:

  1. 使用 Win32 API 在域 A 上模拟用户 B。

  2. 使用 DirectoryEntry 针对域 A 对用户 B 进行身份验证,然后您可以访问域 A 的 AD 以获取其他用户信息,例如分配的组。

我在一个使用 Windows 身份验证的 ASP.NET 应用程序中实现了它。

希望能帮助到你,

于 2012-10-11T04:56:26.033 回答