在Java中的Active Directory林中工作时,如何将域名转换为LDAP DC?

在Java中的Active Directory林中工作时,如何将域名转换为LDAP DC?,java,active-directory,ldap,kerberos,Java,Active Directory,Ldap,Kerberos,我正在努力解决一个问题,我无法找到一个精益和通用的解决方案。这就是我的情况: 我在一个巨大的广告林中,有超过20个子域在数百台服务器上复制。假设主域和Kerberos域是COMPANY.COM,我在D1.COMPANY.COM工作。 我确实从Java连接到全球目录,并且能够访问整个forrest以支持所有公司用户 我的连接URL如下:ldap://mycompany.com:3268/DC=company,DC=com 整个程序都运行在一个webapp中,使用SPNEGO对用户进行身份验证,效果

我正在努力解决一个问题,我无法找到一个精益和通用的解决方案。这就是我的情况:

我在一个巨大的广告林中,有超过20个子域在数百台服务器上复制。假设主域和Kerberos域是
COMPANY.COM
,我在
D1.COMPANY.COM
工作。 我确实从Java连接到全球目录,并且能够访问整个forrest以支持所有公司用户

我的连接URL如下:
ldap://mycompany.com:3268/DC=company,DC=com

整个程序都运行在一个webapp中,使用SPNEGO对用户进行身份验证,效果非常好。即,成功登录后,我确实收到用户UPN/Kerberos主体。由于某些原因,林中的所有UPN字段都会更改,以匹配用户的电子邮件地址,而不是保持UPN值不变。这意味着我无法通过krb princ搜索,但我必须去掉用户名并通过
sAMAccountName
搜索。 我假定
sAMAccountName
在整个林中是唯一的,直到昨天一个用户登录失败。经过一些LDAP查询魔术之后,我发现两个用户在两个不同的域中拥有相同的
sAMAccountName
。我的搜索失败了

因此,问题是,如何确定基于Kerberos领域的领域/子域的基本DN/DC

我用剥离的领域字符串找到了几种方法:

  • 构造LDAP URL,连接并读取defaultNamingContext
  • 将域名重新格式化为DC=d1,DC
  • 目前,我正在使用方法2,这似乎是最简单的方法。尽管一些关于堆栈溢出的C#帖子说这可能会因为不相交的空格而失败


    有人知道安全的解决方案吗?最好是将Kerberos主体转换为用户主体名称。

    登录后,您将获得UPN,这是一封电子邮件。它的用户名部分可以使用,因为它不是唯一的。无法使用域部分,因为它需要与命名上下文相同。您可能有dc=mydomain,dc=com,但电子邮件的域可以类似于myemaildomain.com。我也可以把它作为附加的UPN,我想这就是你的情况

    不要采取第二种方法。拿第一个来说。 执行dns srv查找_ldap._tcp.domain.com 阅读有关DnsQueryConfig的信息以获取配置的域名 获取服务器名称。 执行请求namingContext的rootDse搜索。 并构造LDAPURL

    此外。。, 看起来您域中的emailid在整个林中是唯一的(?) 如果是这样,您可以将电子邮件id标记为PAS属性,以便每个GC都有它的副本,并在GC端口上对电子邮件id进行ldap搜索。但这是一个非常糟糕的选项,因为这需要对模式进行更改,而对20多个子域进行更改。

    Kaylan,oVirt项目(www.oVirt.org)包含Spring Ldap代码,该代码向您展示了如何针对Active Directory、RHD、ipa和Tivoli DS使用Kerberos进行身份验证。我们仍然需要继续并实现林功能(刚才问了一个关于在Java中实现CLdap的问题)。为了获得defaultNamingContext,您必须向所需的域发出RootDSE查询(我们在oVirt中也有一些代码)。 您可以通过执行git clone下载源代码,也可以使用

    请查看engine\backend\manager\modules\bll\src\main\java\org\ovirt\engine\core\bll\adbroker下的代码


    您将在这里看到您的this所需的一切。

    samAccountName在整个森林中都是独一无二的。否则,您的服务器会出现一些严重问题。这两台服务器上的GC可能不同步?@kalyan实际上不是。它必须是根据文章。看来管理人员真的很马虎。我仔细检查了ti,他们的帐户创建脚本仅针对域进行验证。这是皮塔。创建于年前且上次更改时间的帐户已过期。感谢回复。我花了一些时间进行调查。我导出了所有sAMAcountNames和userPrincipalNames,在前一个中导出了hat>5000个DUP,在后一个中导出了3000个。大多数UPN都是重复的,UPN的服务不正确。电子邮件Id(UPN)不是唯一的:-(还有,我对森林没有控制权。你的猜测是绝对正确的,这会让人头疼。我也倾向于第一步,但我不完全明白我必须做什么。第一步,我会做什么,但第二步我该做什么?绑定到动态映射到con的kerberos领域不是很省事吗crete replicant然后检索defaultNamingContent?这种方法可以避免DNS查找。我不知道如何绑定kerberos领域并检索defaultNamingContext。如果您正在谈论一些现有的API,那么我就迷路了。不幸的是,这两个API都不是唯一的。我将在这里提交一份关于正在工作的脚本的通知单。我是认真的ubt管理员将修复已经创建的帐户,除非帐户可以被保存重命名(如果有的话)。imho唯一的方法是保证sAMAccountName在一个域中是唯一的,因此我将从KRB主体提取Kerberos域,并对其进行DNS查找或绑定,检索defaultnamingcontext,然后我将使用ne base dn执行实际搜索。我已检查了源tarball。此包中的代码太多,无法阅读。您可以缩小范围到任何特定类吗?