【问题标题】:LDAP user authentication across trusted domains跨受信任域的 LDAP 用户身份验证
【发布时间】:2011-06-30 09:34:11
【问题描述】:

我的应用程序通过 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?

【问题讨论】:

  • treeA和treeB之间的信任是什么?他们在同一个森林里吗?

标签: authentication active-directory ldap dns trust


【解决方案1】:

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

【讨论】:

  • 那很好,但它们不是我的服务器,所以我没有这个选项。
【解决方案2】:

应用程序可以访问 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】:

    可能是您刚刚在 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 的测试)也可以解决问题,但可能只是某种应用程序使用。

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

    【讨论】:

    • 我使用 ldap_bind... 函数。目前用户在登录时不发送他们的域名——现在你提到它,这很可能是问题(将尝试!)。
    • @DougN:你在解决你的问题上有什么进展吗?如果您需要和帮助,您应该在问题的文本中包含代码片段。有关您使用的操作系统和环境的更多信息也会有所帮助。
    【解决方案4】:

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

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

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

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

    希望对你有帮助,

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-02-26
      • 2011-01-02
      • 1970-01-01
      • 2014-06-19
      • 1970-01-01
      • 1970-01-01
      • 2012-05-24
      • 2012-03-10
      相关资源
      最近更新 更多