我有一段代码,它接受 ldap 字符串、用户名和密码,然后尝试通过 ldap 服务器进行身份验证。用户名可能包含或不包含域名,例如,“DOMAIN\username”或“username”是此代码的有效输入。
从 ldap 字符串中,我将得到一个清晰的 URL,可能看起来像 LDAP://servername.com/DC=...etc。如果我将服务器名称部分拆分出来,我会得到“servername.com”或“servername.corp”或其他内容。但是,如果我尝试使用 servername.com\username 登录,则不会进行身份验证。因此,一个选项是拆分最后一个“。”(如果有)。从 Active Directory 的角度来看,这有效吗?如果有子域(例如 xyx.servername.com),会发生什么情况?
我必须承认,我对 Active Directory 的了解还不足以回答上述问题,而且我找不到解释这些问题的文档。一些支持您答案的文档确实会很有帮助!
答案1
当登录名显示为 时DOMAIN\user
,DOMAIN 是 AD 域的 NETBIOS 名称。这是通常情况下域的最低子域,但它可以是任何事物。呈现名称的另一种有效方式是使用 UPN 后缀,即[email protected]
。这样做的问题是管理员可以在一个域中拥有多个 UPN,尽管默认为 FQDN。
基本上,如果你控制 AD,你应该知道这一点。如果你不控制,那么你就无法确定。
答案2
查看各种开源软件包的 LDAP 身份验证源代码时,绝大多数会分几个步骤执行 LDAP 身份验证。此方法通常最常用,适用于包括 AD 在内的大多数 LDAP 实现。
- 客户端将首先使用完整专有名称和密码。
- 然后,系统将使用通用凭证对目录进行搜索,以查找尝试进行身份验证的用户的专有名称
- 如果找到有效的用户对象,则初始连接将关闭,并且客户端将尝试使用找到的可分辨名称和用户提供的密码重新连接和绑定。
使用 AD 可以不使用完整 DN 进行身份验证,但是这种方法对于其他一些 LDAP 服务器来说实际上并不适用,因此不常用。