【发布时间】:2011-06-29 06:39:39
【问题描述】:
我正在努力解决无法找到精简通用解决方案的问题。这是我的情况:
我在一个巨大的 AD 森林中,有超过 20 个子域在数百个服务器上进行复制。假设主域和 Kerberos 领域是 COMPANY.COM,我在 D1.COMPANY.COM 工作。
我确实从 Java 连接到全局目录,并且能够访问整个 forrest 以支持所有公司用户。
我的连接网址是这样的: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 主体转换为用户主体名称。
【问题讨论】:
-
samAccountName 在整个森林中是唯一的。否则你的服务器有一些严重的问题。可能这两台服务器上的 GC 不同步?
-
@kalyan 实际上不是。它必须根据this 文章。看来管理人员真的很马虎。我仔细检查了 ti,他们的帐户创建脚本仅针对域进行验证。这是皮塔饼。多年前创建且上次更改时间已过时的帐户。
标签: java active-directory ldap kerberos