首页 文章

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

提问于
浏览
5

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

  • 客户定义LDAP服务器(TreeA)和组(GroupA) . GroupA中的任何用户都可以使用该应用程序 .

  • 在登录时,用户发送他们的用户名和密码 - 如果绑定到LDAP TreeA并且他们的凭据有效,并且他们的用户帐户在GroupA中,他们很高兴去

我遇到了两个活动目录相互信任的情况,TreeA中指定的GroupA包含来自TreeB的用户 . 因此,第2步失败是因为我正在尝试针对TreeA对UserB(来自TreeB)进行身份验证 .

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

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

4 回答

  • 0

    可能是您在LDAP服务器(TreeA)上遇到配置问题 . 您写道TreeA和TreeB之间存在信任,因此您可以将UserB(来自TreeB)添加为TreeA中GroupA的成员 . 如果你能做到这一点,那么你就可以在TreeA和TreeB之间的正确方向上成功 Build 信任 . 您应该理解,该信任仅表示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的测试)也可以解决问题,但它可能只是某种应用程序的使用 .

    无论如何,您问题中的更多信息可以缩小问题范围并解决问题 .

  • 0

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

  • 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”等登录名登录 .

  • 1

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

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

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

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

    希望能帮助到你,

相关问题