我的应用程序通过LDAP(通常是Active Directory)定义授权用户:
我遇到了两个活动目录相互信任的情况,TreeA中指定的GroupA包含来自TreeB的用户。因此,第2步失败是因为我正在尝试针对TreeA验证UserB(来自TreeB)。
应用程序可以访问TreeA,所以我想它可以在GroupA中查看并在那里查看UserB。但是它怎么知道它需要向TreeB发送绑定请求以验证用户名和密码?
有没有更好的方法来解决这个问题? 由于存在信任关系,这种对TreeA的绑定请求是否应自动转发到TreeB?
答案 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进行身份验证,那么您需要做的是:
使用Win32 API在域A上模拟用户B.
使用DirectoryEntry针对域A对用户B进行身份验证,然后您可以访问域A的AD以获取其他用户信息,例如已分配的组。
我已在使用Windows身份验证的ASP.NET应用程序中实现了它。
希望它有所帮助,