经过大量的hit and trial方法搜索,我能够合理地制定解决方案。
这里值得一提的是Jorge de Almeida Pinto 的以下链接User Principal Name in AD。请从那里获取 iUPN 和 eUPN 的详细信息。
我将我的问题陈述再次解释为场景以使其更加清晰。
场景
- 域 (domain.com) 中的 AD 中只有两个用户,分别名为 Anil 和 Alex。
-
iUPN 对于 Anil 是 Anil@domain.com 而对于 Alex 是 Alex@domain.com(即默认情况下由 AD 自己设置)。
-
eUPN 为 Anil 留空(这意味着它将是 Anil@domain.com,AD 的默认行为)。但对于 Alex,出于任何原因,它被设置为 Alex@dummy.com。
您可以从链接Active Directory With C# 获得关于广告交互的想法,我发现该链接写得很好。
作为一名程序员,我想编写代码以使这两个用户都能从代码中登录 AD。
问题
- Anil@domain.com 登录成功。
- Alex@dummy.com 无法登录。
原因
我无法找到完美的根本原因。
但我的猜测是,AD 本身将域名放在 @(按速率) 之后。由于 Alex 的域名是 dummy.com,因此 AD 会尝试查找后缀为 @dummy.com 的用户。并返回未找到用户的结果。
解决方案
- 解决方案是剖析用户名和域名。
- 将 根域名 (domain.com) 作为后缀附加到用户(带有单独的域名)。然后尝试登录。
您可以提出其他未经授权的用户也可以通过这种方式进入的问题。不!因为密码需要匹配。
为什么有效?
因为 AD 能够在 domain.com 中找到具有 Alex@domain.com 的用户。
编辑
我提供的解决方案仅适用于其他用户具有相同 sAMAccountName 和相同域名的情况。
但如果 sAMAccountName 本身设置为 Alex@dummy.com 会怎样。所以真正的解决方案是按照 -
(1) 根据 UPN 获取 sAMAccountName。
/// <summary>
/// Get sAMAccountName for matching UserPrincipalName (UPN)
/// </summary>
/// <param name="domain">Domain name</param>
/// <param name="userName">Username</param>
/// <returns></returns>
protected string GetSamUsername(string domain, string userName)
{
string samName;
using (var pc = new PrincipalContext(ContextType.Domain, domain))
{
var user = UserPrincipal.FindByIdentity(pc, userName); // Search for this user
if (user == null) return null; // If user is not there, why go forward
samName = user.SamAccountName;
}
return samName;
}
(2)现在任何用户都可以登录。
它还帮助我们在 AD 中验证用户的存在。