使用备用UPN后缀对AD用户进行身份验证



这个问题可能与此处链接处的问题间接匹配

我正在做一个基于Asp.Net4.0的网站项目,供公司使用。

网站上有一个表单,要求用户提供他们的AD用户名和密码,默认情况下选择域名。

我知道通过根域名对用户进行身份验证的方法。但也有一些用户的域名(UPN后缀)被修改了。

例如域名为xyz.com。因此用户通过进行身份验证user@xyz.com及其密码。但对于一些用户来说,他们的名字是user@abc.com

那么,如何使用除了根域名之外的其他UPN后缀来验证这些用户呢

经过大量的hit和trial方法的搜索,我能够合理地为其制定解决方案。

以下链接Jorge de Almeida Pinto的AD中的用户主体名称值得一提。请从那里获得iUPN和eUPN的详细信息。

我再次将我的问题陈述作为场景进行解释,以使其更加清晰。

场景

  1. 域(domain.com)中的AD中只有两个用户,分别命名为AnilAlex
  2. iUPN 对于Anil是Anil@domain.com而Alex是Alex@domain.com(默认情况下由AD自身设置)
  3. Anil的eUPN为空(这意味着它将Anil@domain.com,AD的默认行为)。但对于亚历克斯来说,它被设置为Alex@dummy.com由于任何原因

您可以从Active Directory与C#的链接中获得AD交互的想法,我发现它写得很好。

作为一名程序员,我想编写代码,让这两个用户都能从代码中登录AD。

问题

  • Anil@domain.com成功登录
  • Alex@dummy.com无法登录

原因

我一直没能找到完美的根本原因

但我的猜测是,AD本身将域名放在@之后(按速率)。由于Alex的域名是dummy.com,因此AD试图找到后缀为@dummy.com的用户。结果为未找到用户。

解决方案

  1. 解决方案是解析用户名和域名
  2. 根域名(domain.com)作为后缀附加到用户(使用单独的域名)。然后尝试登录

您可能会有其他未经授权的用户也可以通过这种方式进入的问题。不因为密码需要匹配。

为什么有效

因为AD能够找到具有的用户Alex@domain.com在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中的用户存在。

如果第一次尝试失败(使用默认域名),则显示带有域名选项的表单。

或者,为提前填写的域名提供一个文本框,用户可以在必要时进行修改。

当身份验证失败时,请确保向他们显示一条消息,指示他们需要注意您显示的域名。

更新:

private void AuthenticateUser(string loginID, string pwd) {
var search = new DirectorySearcher(m_rootDir);
if (-1 < loginID.IndexOf("@")) {
search.Filter = "(&(objectClass=user)(SAMAccountName=" + loginID + "))";
} else { // this is their Common Name
search.Filter = "(&(objectClass=user)(cn=" + loginID + "))"; // Get User By Full Name
}
// more code here
}

相关内容

最新更新