跨受信任域的LDAP用户身份验证

时间:2011-02-19 14:39:42

标签: authentication active-directory ldap dns trust

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

  1. 客户定义LDAP服务器(TreeA)和组(GroupA)。 GroupA中的任何用户都可以使用该应用程序。
  2. 在登录时,用户会发送他们的用户名和密码 - 如果绑定到LDAP TreeA并且他们的凭据有效,并且他们的用户帐户在GroupA中,那么他们就可以了。
  3. 我遇到了两个活动目录相互信任的情况,TreeA中指定的GroupA包含来自TreeB的用户。因此,第2步失败是因为我正在尝试针对TreeA验证UserB(来自TreeB)。

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

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

4 个答案:

答案 0 :(得分:1)

可能是您在LDAP服务器(TreeA)上遇到配置问题。您写道TreeA和TreeB之间存在信任,因此您可以将TreeB(来自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访问LDAP。在您的问题中,您没有写任何有关API的信息。您是否使用ldap_bind_s之类的Win32 API或在.NET中使用DirectoryEntry?在这两种情况下,在绑定期间明确使用域名和帐户名(对于UserB)或者使用null作为用户当前用户凭证的名称和密码可能很重要。

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

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

答案 1 :(得分:0)

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

答案 2 :(得分: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”等登录名登录。

答案 3 :(得分:0)

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

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

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

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

    希望它有所帮助,