C# 使用备用UPN后缀验证AD用户

C# 使用备用UPN后缀验证AD用户,c#,asp.net,active-directory,C#,Asp.net,Active Directory,此问题可能与链接处的问题间接匹配 我正在为公司使用的基于Asp.NET4.0的网站项目工作 网站上有一个表单,要求用户输入默认选择域名的广告用户名和密码 我知道通过根域名验证用户身份的方法。但有些用户的域名(UPN后缀)已被修改 例如域名是xyz.com。因此,用户通过user@xyz.com及其密码。但对于一些用户来说,他们的名字是user@abc.com 那么如何使用根域名以外的可选UPN后缀验证此类用户?如果第一次尝试失败(使用默认域名),请使用域名选项显示表单 或者,提供提前填写的域名文

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

我正在为公司使用的基于Asp.NET4.0的网站项目工作

网站上有一个表单,要求用户输入默认选择域名的广告用户名和密码

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

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


那么如何使用根域名以外的可选UPN后缀验证此类用户?

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

或者,提供提前填写的域名文本框,用户可以根据需要修改

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

更新:

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
}
private void AuthenticateUser(字符串loginID,字符串pwd){
var search=newdirectorysearcher(m_rootDir);
如果(-1
通过大量的点击和试用方法搜索,我能够合理地制定解决方案

下面的链接值得一提。请从那里获取iUPN和eUPN的详细信息

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

脚本
  • 在域(domain.com)中只有两个名为Anil和Alex的用户
  • iUPN对于Anil isAnil@domain.com而亚历克斯则是Alex@domain.com(默认情况下由AD自身设置)
  • eUPN对于Anil,它被保留为空(这意味着它将是Anil@domain.com,AD的默认行为)。但是对于Alex,它被设置为Alex@dummy.com出于任何原因
  • 你们可以从我发现写得很好的链接中得到广告互动的想法

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

    问题
    • Anil@domain.com成功登录
    • Alex@dummy.com无法登录
    理由 我没能找到它的完美根源

    但我的猜测是,广告本身把域名放在@(按速率)之后。因为Alex的域名是dummy.com,所以AD试图找到后缀为@dummy.com的用户。并返回未找到用户的结果

    解决方案
  • 解决方案是剖析用户名和域名
  • 根域名(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;
        }
    
    //
    ///获取匹配UserPrincipalName(UPN)的sAMAccountName
    /// 
    ///域名
    ///用户名
    /// 
    受保护的字符串GetSamUsername(字符串域、字符串用户名)
    {
    字符串samName;
    使用(var pc=new PrincipalContext(ContextType.Domain,Domain))
    {
    var user=UserPrincipal.FindByIdentity(pc,用户名);//搜索此用户
    if(user==null)返回null;//如果用户不在那里,为什么要继续
    samName=user.SamAccountName;
    }
    返回samName;
    }
    
    (2)现在任何用户都可以登录


    它还帮助我们在广告中验证用户的存在。

    我在dropdownlist中向他们显示域名(默认选择的域名)。但对于UPN不是域名的用户呢。有一些用户user@xyz.com. 并成功地对其进行了身份验证。因为实际上存在相同的域名。但对于具有user@abc.com. 实际上没有这样的域名。那么如何验证这些用户。我不确定你是如何验证的。使用
    user@abc.com
    存在于Active Directory帐户中,用户位于
    user@xyz.com
    ?如果没有,则需要专门调用abc.com Active Directory服务器或将其添加到xyz.com Active Directory服务器。不管怎样,abc.com的用户都不会喜欢使用多个密码。是的!两个用户都存在于同一个广告中,但其中一个用户具有可选后缀。