Active Directory 真的符合 LDAP 标准吗?

Posted

技术标签:

【中文标题】Active Directory 真的符合 LDAP 标准吗?【英文标题】:Is Active Directory Really LDAP-Compliant? 【发布时间】:2010-01-20 05:10:17 【问题描述】:

我正在为我们的一种产品(RMS)开发一个插件,该插件允许客户将存储在其 LDAP 目录中的员工信息导入我们应用程序中相应的 Person 记录。

我们的 RMS 允许 Person 记录具有多个姓名和地址(这是一个公共安全系统:此功能用于支持具有 AKA 和多个已知地址的人员)。由于软件的性质,如果 LDAP 服务器支持,我们认为从 LDAP 中提取多个名称和地址会非常有用。

我的印象是 Active Directory 会支持这一点,但似乎根本不支持。例如,查看RFC 2256,第 5.41 和 5.42 节,很明显givenName 旨在成为一个多值字段(即语法未指定SINGLE-VALUE,而RFC 2252 声明“多-value”是默认值)。 cnsnstreetAddress 以及我费心查找的大多数其他“标准”属性也是如此。

Microsoft 的 own documentation 似乎暗示它们符合 RFC 2256:

目前,Windows 2000 Active 目录达到 LDAP 合规性 通过对以下 RFC 的支持。

[RFC 2256 被列在各种“支持”的 RFC 中,标题为“核心 LDAP 要求 – RFC 3377”]

RFC 3377 声明 RFC 2256 确实是 8 个 RFC 集合的一部分,这些 RFC 共同构成了 LDAPv3 的完整技术规范。

我很困惑:不会不遵循标准属性的实际建议语法,例如givenName 等。是否构成“违规”?

另外,是否有人明确列出了连接和查询 Active Directory 与其他目录服务器(OpenLDAP、eDirectory 等)之间的区别?这是一个 VB6 应用程序,所以我一直在使用 ADSDSOObject ADODB 提供程序。最初我以为我可以为任何目录服务器编写相同的代码,只要我使用标准属性就可以让它工作,但显然如果相同的属性在某些实现中定义为单值而在其他实现中定义为多值,我'将不得不编写代码来处理这种情况。

我开始怀疑这是否是为什么这么多具有​​某种“LDAP 集成”的应用程序通常有一个完全独立的“Active Directory”设置页面,然后是“所有其他 LDAP 服务器的设置”的原因之一那不是 Active Directory”...

【问题讨论】:

只有一件事我比 LDAP 更讨厌,那就是 Lotus Notes 嗯..我猜“支持”与“完全合规”不一样。 @Mitch Wheat:虽然我还没有享受到使用 Lotus Notes 的“乐趣”,但从我所听到和读到的所有内容来看,我认为我可以肯定地说这是一个公平的声明:-) @o.k.w:实际上,我链接到的 Microsoft 文档中列出“RFC 2256”的表格位于“核心 LDAP 要求 – RFC 3377”标题下,所以看起来有点像很高兴他们按照 RFC 建议的方式实现它。啊,微软…… @marc_s:它有效,你只需要确保持有你想要的属性的Field是正确的数据类型(多值字段存储为adVariant:实际的字段数据是Variant) 的数组。在 VB6 中,这将打印 someAttribute 的所有值,如果它是多值的:If rs("someAttribute").Type = adVariant and Not IsNull(rs("someAttribute")) Then Debug.Print Join(rs("someAttribute").Value, ", ") 【参考方案1】:

“遵从”标准的问题在于,很少有实体或软件在所有可能的方面真正 100% 兼容。相反,在没有某些指导方针或规则的情况下,使用“合规”一词通常意味着实施实体认为软件满足规范的实质。

例如,以 CSS 2 级为例。当今大多数现代浏览器都声称“符合 CSS 2 标准”,但并不是每个此类浏览器都 100% 实现规范。尽管如此,用户可能会发现大部分情况下的渲染体验大致相同。因此,合规性往往通过以下组合来表示:

实施者的声明(例如,Mozilla 发表声明称 Firefox 3.5 符合 CSS 2) 第三方测试(例如 Acid 测试)

这与 AD 和 LDAP“合规性”的方式大致相同。您链接的文档暗示没有任何合规性或一致性指令,因此微软在这里采取了(合理的,IMO)立场,即“供应商声明与第三方测试套件相结合是最合适的替代方案”。从本质上讲,这意味着如果 Exchange 和其他声称 LDAP 合规性的实体通过了衡量标准合规性的测试,那么它们实际上就是合规的。

【讨论】:

我明白你的意思,CSS 和一般的网络浏览器绝对是类似问题的一个很好的例子。我想我对这个设计决策甚至在 AD 中是如何产生的有点困惑:当你定义模式时,你必须明确地将一个属性定义为“单值”;默认值为“多值”,在 LDAP 规范中实际上很少有属性被定义为 SINGLE-VALUE。我并不是说微软是故意或恶意这样做的,但似乎他们必须付出额外的“努力”才能以“错误”的方式去做。只是奇怪,有点烦人...... 对比一下,LDAP 市场中的其他大玩家似乎以正确的方式做事,或者至少比 Microsoft 更准确地实施规范。它让人想起“最好使用 Internet Explorer 查看此页面”的日子。 @John Feminella:我其实很喜欢 CSS 比较。就像 CSS 一样;合规并不意味着不能有错误,因此标准遵守不能替代测试。但“实施的标准”是指“实施的标准或标准的超集”,而不是“实施的标准的子集”。就像在 InternetExplorer 中一样,“未实现”、完全不符合标准的实现和错误之间存在差异。如果您的浏览器显示“符合 CSS 2”,但没有实现一些 CSS 2 功能,则表示它不“符合 CSS 2”。我不在乎任何人减少的测试套件。【参考方案2】:

不幸的是,Active Directory 破坏了许多 LDAP 事物,而“单值性”只是其中之一。

我开始怀疑这是否是为什么这么多具有​​某种“LDAP 集成”的应用程序通常有一个完全独立的“Active Directory”设置页面的原因之一...

绝对的。

是否有人明确列出了连接和查询 Active Directory 与其他目录服务器(OpenLDAP、eDirectory 等)之间的区别?

我一个都没见过。但是,Active Directory 架构在 MSDN 中有详细记录,因此您可以随时检查差异。

【讨论】:

以上是关于Active Directory 真的符合 LDAP 标准吗?的主要内容,如果未能解决你的问题,请参考以下文章

通过 LDAP 连接到 Active Directory

Jenkins + Active Directory身份验证 - 缓慢登录

操作教程|JumpServer使用OpenID对接Azure Active Directory (Azure AD)身份认证

根据 ASP.NET Windows 身份验证的用户名与 Active Directory 中的登录名不匹配

powershell 用于将Active Directory组添加到Active Directory的Powershell脚本

Active Directory 和 Active Directory LDS 中的字段