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

时间:2014-01-13 20:12:12

标签: c# asp.net active-directory

此问题可能与链接here上的问题间接匹配。

我正在开发基于Asp.Net 4.0的网站项目供公司使用。

网站上有一个表格,要求用户提供默认选择域名的AD用户名和密码。

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

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

那么如何使用除根域名之外的其他UPN后缀来验证此类用户?

2 个答案:

答案 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的详细信息。

我再次解释我的问题陈述,以使其更清晰。

方案

  1. 域中的AD( domain.com )中只有两个用户名为 Anil Alex
  2. Anil的
  3. iUPN Anil@domain.com ,Alex的 <@ strong> (默认情况下由AD本身设置)。
  4. Anil的
  5. eUPN 被留空(这意味着它将是Anil @ domain.com,AD的默认行为)。但对于Alex来说,无论出于何种原因,它都被设置为 Alex@dummy.com
  6. 您可以从链接Active Directory With C#获取AD交互的想法,我发现这篇文章很好。

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

    问题

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

    原因

    我无法找到完美的根本原因。

    但我的猜测是,AD本身将域名置于 @(按此速率)之后。由于Alex的域名为 dummy.com ,因此AD会尝试找到后缀为@ dummy.com的用户。并且没有用户找到返回结果。

    解决方案

    1. 解决方案是剖析用户名和域名。
    2. 根域名(domain.com) 附加为用户后缀(具有单独的域名)。然后尝试登录。
    3. 您可以通过这种方式获得其他未经授权的用户也可以进入的问题。没有!因为密码需要匹配。

      为什么会有效?

      因为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中的用户存在。