c# - 按公司名称过滤 Active Directory 用户,Asp.net Core 2.1

标签 c# asp.net asp.net-mvc asp.net-core active-directory

问题

我正在寻找一种方法,根据当前登录用户的 Active Directory 公司名称(通过 AD 配置文件找到)从 Active Directory 中过滤用户。

要搜索 AD,我当前使用以下代码,该代码返回所有用户,包括系统帐户 -

PrincipalContext context = new PrincipalContext(ContextType.Domain, "mydomain");
var domainUsers = new List<string>();
var userPrincipal = new UserPrincipal(context);

using (var search = new PrincipalSearcher(userPrincipal))
{
    foreach (var user in search.FindAll())
    {
        if (user.DisplayName != null)
        {
            domainUsers.Add(user.DisplayName);
        }
    }
}

我正在寻找一种方法来仅返回与当前 AD 登录用户的公司名称匹配的用户。即,如果公司名称为 Test123,则搜索结果将仅包括属于 Test123 公司的所有其他用户。

背景

我正在开发一个 ASP.NET MVC 2.1 Web 应用程序,它需要 Active Directory 中的用户下拉列表。

最佳答案

Search All users in Active Directory and match against company field.

在迭代根据查询找到的所有用户的列表时,您可以将 Principal 转换为 DirectoryEntry,因为Principal 没有您需要的信息。 DirectoryEntry 具有您可以在过滤方面查找和使用的属性。本示例中仅使用“公司”。

    PrincipalContext context = new PrincipalContext(ContextType.Domain, "mydomain");
    var domainUsers = new List<string>();
    var userPrincipal = new UserPrincipal(context);
    string myCompany = "Test123";
    using (var search = new PrincipalSearcher(userPrincipal))
    {
        foreach (Principal user in search.FindAll())
        {
            string usersCompany = ((DirectoryEntry)user.GetUnderlyingObject())?.Properties["company"]?.Value?.ToString();
            if (user.DisplayName != null && usersCompany != null && usersCompany.Equals(myCompany))
            {
                domainUsers.Add(user.DisplayName);
            }
        }
    }

编辑

出于性能原因,我建议使用 DirectorySearcher 而不是使用 PrincipalSearcher。这是另一个版本。搜索在执行 FindAll() 之前完成。

    string myCompany = "Test123";
    string searchQuery = $"(&(objectCategory=user)(objectClass=user)(company={myCompany}))";

    // You can define the fields you want retrieved from AD (Noted by @GabrielLuci)
    DirectorySearcher ds = new DirectorySearcher(searchQuery, 
                               new string[] { "DisplayName" }); 
    foreach(SearchResult user in ds.FindAll())
    {
        domainUsers.Add(user.Properties["DisplayName"][0].ToString());
    }

关于c# - 按公司名称过滤 Active Directory 用户,Asp.net Core 2.1,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59933584/

相关文章:

c# - 在来自不同列表的多个表上显示列标题

c# - 通用静态类有多个实例?

c# - 是否可以传递一个参数 DB.null 并在数据库中设置一个等于该值的值?

如果 ModelState 无效,ASP.NET MVC AJAX 更改 UpdateTargetId

asp.net-mvc - MVC4 和 IIS 基本身份验证

asp.net-mvc - EF 4 代码如何首先处理生产环境中的架构更改?

c# - 我不使用 Newtonsoft.Json,但收到错误消息说找不到它

c# - NHibernate QueryOver WithSubQuery WhereAll 子句

c# - 如何创建周期性日历事件?

javascript - 需要在 ASP.NET 回发逻辑期间发出 jQuery 确认消息