【问题标题】:Authenticate AD user with alternate UPN suffix使用备用 UPN 后缀对 AD 用户进行身份验证
【发布时间】:2014-02-05 00:21:47
【问题描述】:

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

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

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

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

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

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

【问题讨论】:

    标签: c# asp.net active-directory


    【解决方案1】:

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

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

    当认证失败时,一定要向他们显示一条消息,表明他们需要注意您显示的域名。

    更新:

    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
    }
    

    【讨论】:

    • 我在下拉列表中显示他们的域名(默认选择一个)。但是 UPN 不是域名的用户呢?有 user@xyz.com 的用户。并且它们已成功通过身份验证。因为实际上存在同一个域名。但是对于 user@abc.com 的用户。现实中没有这样的域名。那么如何对此类用户进行身份验证。
    • 我不确定您是如何进行身份验证的。具有user@abc.com 的用户是否存在于具有user@xyz.com 用户的Active Directory 帐户中?如果没有,您需要专门调用 abc.com Active Directory 服务器或将它们添加到 xyz.com Active Directory 服务器。无论哪种方式,abc.com 用户都会不喜欢使用多个密码。
    • 是的!两个用户都存在于同一个 AD 中。但是一个是带有替代后缀的。
    【解决方案2】:

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

    这里值得一提的是Jorge de Almeida Pinto 的以下链接User Principal Name in AD。请从那里获取 iUPN 和 eUPN 的详细信息。

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

    场景

    1. 域 (domain.com) 中的 AD 中只有两个用户,分别名为 AnilAlex
    2. iUPN 对于 Anil 是 Anil@domain.com 而对于 Alex 是 Alex@domain.com(即默认情况下由 AD 自己设置)。
    3. 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 的用户。并返回未找到用户的结果。

    解决方案

    1. 解决方案是剖析用户名和域名。
    2. 根域名 (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 中验证用户的存在。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-11-04
      • 1970-01-01
      • 2018-05-22
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多