使用Active Directory用户自动完成文本框

时间:2016-01-28 15:36:53

标签: c# json asp.net-mvc active-directory

您好我正在尝试创建一个文本框,当用户输入该文本框时,他们会获得具有特定名称的用户列表:

示例:如果我开始输入Jane.Doe,并且我只输入了Ja,那么列表将会出现以Ja开头的Active Directory用户。我需要弄清楚每次用户输入时如何让用户进入列表。我几乎完成了ajax方面。它只是每次更新用户列表。

我目前的想法:

 [HttpPost]
    public ActionResult RemoteData(string query)
    {
        List<string> lstADUsers = new List<string>();

        using (var context = new PrincipalContext(ContextType.Domain, null, "LDAPPATH"))
        {
            using (var searcher = new PrincipalSearcher(new UserPrincipal(context)))
            {
                foreach (var result in searcher.FindAll())
                {
                    DirectoryEntry de = result.GetUnderlyingObject() as DirectoryEntry;

                    string usersWithName;


                    if (!String.IsNullOrEmpty((String)de.Properties["samaccountname"].Value))
                    {
                        usersWithName = de.Properties["samaccountname"].Value.ToString();



                        lstADUsers.Add(usersWithName);
                    }

                }
            }
        }

        List<string> listData = null;
        if (!string.IsNullOrEmpty(query))
        {

            listData = lstADUsers.Where(q => q.ToLower().StartsWith(query.ToLower())).ToList();

        }   

        return Json(new { Data = listData });
    }

因此,这允许我们在Active Directory中获得每个用户,但我不想要这样,因为手头的问题会导致用户太多而搜索需要FOREVER在它显示名称列表之前加载它。我只希望能够获取参数并仅搜索以该开头的用户。我该怎么做呢?

1 个答案:

答案 0 :(得分:2)

您需要使用通配符填充Name UserPrincipal属性以限制结果集:

// assume 'query' is 'Ja'
UserPrincipal user = new UserPrincipal(context);
user.Name = query + "*"; // builds 'Ja*', which finds names starting with 'Ja'
using (var searcher = new PrincipalSearcher(user))
// ...