Active Directory 用户对象包括许多可以被视为标识符的字段。下面列出了其中一些及其在 ADUC 中的标签及其属性名称:
- 全名 - cn
- ? - 姓名
- 用户 sAMAccountName 登录 - sAMAccountName
- 用户 UPN 登录:userPrincipalName
- ? - 专有名称
我试图让我们的开发人员在编写针对 AD 进行身份验证的自定义代码时标准化仅使用其中之一 - 问题是我不确定哪个是“正确的”,或者不同的代码是否正确情况。我什至不确定是否应该使用上述任何字段!
有没有其他人选择了一个一致地使用,是什么影响了你的决定?有什么文件可以澄清这个问题吗?
CN(通用名)不适合登录,因为单独的 CN 不能唯一标识用户。我可以有一个
CN=Ryan Ries,OU=Dallas,DC=Domain,DC=com
我也可以有一个
CN=Ryan Ries,OU=New York,DC=Domain,DC=com
用户的 CN 也是一个 RDN(相对专有名称)。它们具有相同的 CN,但 DN 不同。您可能会注意到,如果您的组织中有两个名为 Ryan Ries 的人,您会遇到问题,并且您必须为第二个人设置 SamAccountName,例如
rries2
.DN(专有名称)不适合登录,因为谁想使用类似的用户名登录系统
CN=ryan,OU=Texas,DC=brazzers,DC=com
?虽然使用 DN 确实可以唯一且明确地识别用户,但必须输入是很烦人的。文件系统上的相对路径和绝对路径是同一种概念。这也意味着您无需搜索即可确切知道对象在目录结构中的位置。你经常不这样做。这称为歧义名称解析 (ANR) - 当您没有用户的专有名称时,在目录中搜索用户。
UPN(用户主体名称)非常好,因为它们看起来像电子邮件地址,可以与用户的公司电子邮件地址相同,易于记忆,并且首选登录,因为名称将被搜索首先在本地域中,然后在森林中搜索它。
在设计应用程序时,请记住最后的“不需要”位。
SamAccountName 也很好,因为 SamAccountName 需要对域中的每个人(但不是森林)都是唯一的。此外,SamAccountNames 很短。大多数人使用 SamAccountNames 登录,即使他们没有在 AD 林中唯一标识您,这就是为什么您必须指定一个域名以与您的 SamAccountName 一起使用,以便系统知道您尝试登录的域.
以下是有关该问题的一些出色文档以供进一步阅读:
http://msdn.microsoft.com/en-us/library/windows/desktop/ms677605(v=vs.85).aspx
http://msdn.microsoft.com/en-us/library/windows/desktop/ms680857(v=vs.85).aspx
如果您将 username 称为某人将要登录的内容,我建议您使用
sAMAccountName
,它与域名组合是唯一的,或者userPrincipalName
,它在森林中是唯一的。就用户名作为唯一标识符而言,Windows 将 SID 用于所有访问控制条目,并提供一整套将用户名转换为 SID 的方法。SID 与帐户生命周期的用户隐喻相匹配,因为在域内重命名和移动没有效果,但删除和重新创建会产生新的 SID。
为此,我会调用
LookupAccountName
,它接受一个代表用户名的字符串,并返回找到用户所在域的sAMAccountName
、SID
和域名。然后用户可以使用windows支持的任何语法登录,不需要额外的培训。
我建议允许用户选择他想要使用的名称格式并确定用户在应用程序端的输入。例如:如果用户键入:[email protected] - 将其视为 UPN 并在 AD 中搜索 UPN。如果用户键入: username - 将其视为预定义默认域的 samAccountName,当然如果用户键入 domain\username - 将其视为来自指定域的 samAccountName。始终检索用户的 SID 并将所有权限分配给 SID,因为人们结婚并且用户名可以更改。