如何从 ASP.NET Core 搜索 Active Directory 中的用户

问题描述 投票:0回答:1

我不知道如何在 Active Directory 中搜索用户。这是我目前的尝试,但我还没有运行过。

public class ADController : Controller
{
    [HttpGet]
    public IActionResult Find()
    {
        return View();
    }

    [HttpPost]
    public IActionResult Find(FindViewModel model)
    {
        DirectoryEntry entry = new DirectoryEntry("LDAP://<full user name>,<Users>,<domain component>");

        DirectorySearcher searcher;
        SearchResultCollection results;

        searcher = new DirectorySearcher(entry);

        searcher.Filter = "(&(objectClass=user)(displayname=*))";
        searcher.SearchScope = SearchScope.Subtree;

        using (searcher)
        {
            results = searcher.FindAll();

            foreach (SearchResult result in results)
            {
                string searchOK = result.Properties["displayname"][0].ToString();
                //objects.Add(searchOK);
            }
        }
        return View();
    }
}
public class FindViewModel
{
    [Display(Name = "UserActiveDirectory")]
    public string UserAD { get; set; }
}
c# asp.net-core active-directory ldap
1个回答
0
投票

您的要求有点不清楚,但我假设:

  1. 您想将用户名传递给控制器
  2. 在 AD 中找到该用户,
  3. 将找到的用户的
    displayName
    传递到您的视图

如果是这样的话:

首先,由于您只需要将单个字符串传递到控制器中,因此使用类作为参数没有任何好处。只需使用单个字符串:

public IActionResult Find(string username)

然后您需要在过滤器中使用用户名。没有名为“用户名”的属性,但最常指的是

sAMAccountName
。然而,它也可以指
userPrincipalName
,其格式为
[email protected]
。但我假设
sAMAccountName

奇怪的是,仅仅

(objectClass=user)

 不足以将搜索限制为仅用户帐户。例如,计算机对象的 
objectClass
user
。因此,如果您想将搜索限制为仅用户帐户,则还需要包含 
(objectCategory=person)

searcher.Filter = $"(&(objectClass=user)(objectCategory=person)(sAMAccountName={username}))";
默认情况下,

SearchScope

Subtree
,所以你不需要这一行:

searcher.SearchScope = SearchScope.Subtree;
您还应该使用 

PropertiesToLoad

 集合,因为如果不这样做,它将返回每个属性。因此,仅将您计划使用的属性放在那里:

searcher.PropertiesToLoad.Add("displayName");
由于您通过 

sAMAccountName

 进行搜索,这保证在域中是唯一的,因此您可以使用 
FindOne()
 而不是 
FindAll()
,因为您知道只能有一个结果(或没有)。

var result = searcher.FindOne();
如果 

result

 不是 
null
,则表示已找到用户,您可以将 
displayName
 传递给视图:

if (result != null) { string displayName = (string) result.Properties["displayname"][0]; return View(displayName); }
否则,不要将任何内容传递给视图,并且您将必须在视图中处理这种情况。

总而言之,看起来像这样:

public IActionResult Find(string username) { var entry = new DirectoryEntry("LDAP://<full user name>,<Users>,<domain component>"); var searcher = new DirectorySearcher(entry) { Filter = $"(&(objectClass=user)(objectCategory=person)(sAMAccountName={username}))", PropertiesToLoad = { "displayName" } }; var result = searcher.FindOne(); if (result != null) { string displayName = (string) result.Properties["displayname"][0]; return View(displayName); } return View(); }
您可能仍需要根据您的实际要求进行一些更新,但这应该可以帮助您开始。

© www.soinside.com 2019 - 2024. All rights reserved.