此问题可能与链接here上的问题间接匹配。
我正在开发基于Asp.Net 4.0的网站项目供公司使用。
网站上有一个表格,要求用户提供默认选择域名的AD用户名和密码。
我知道通过root域名验证用户的方法。但是有些用户的域名(UPN后缀)已被修改。
例如,域名为 xyz.com 。因此,用户通过 user@xyz.com 及其密码进行身份验证。但对于某些用户,他们的名字是 user@abc.com 。
那么如何使用除根域名之外的其他UPN后缀来验证此类用户?
答案 0 :(得分:0)
如果您的第一次尝试失败(使用默认域名),请显示包含域名选项的表单。
或者,提供一个文本框,用于提前填写的域名,用户可以根据需要进行修改。
当身份验证失败时,请务必向他们显示一条消息,指出他们需要关注您显示的域名。
<强>更新强>
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
}
答案 1 :(得分:0)
经过点击和试用方法的大量搜索后,我能够有理由为它制定解决方案。
User Principal Name in AD之后的Jorge de Almeida Pinto以下链接值得一提。请从那里获取iUPN和eUPN的详细信息。
我再次解释我的问题陈述,以使其更清晰。
您可以从链接Active Directory With C#获取AD交互的想法,我发现这篇文章很好。
作为程序员,我想编写代码,让这两个用户从代码中登录AD。
我无法找到完美的根本原因。
但我的猜测是,AD本身将域名置于 @(按此速率)之后。由于Alex的域名为 dummy.com ,因此AD会尝试找到后缀为@ dummy.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中的用户存在。