Asp.net 核心中的 Active Directory

Active Directory in Asp.net core

我之前已经发布了一个问题并且 none 回答了所以我想我必须为我的问题添加更多信息,所以我的问题是我不知道如何从我试图找到的 AD 中搜索用户解决方案,但没有成功,大多数开发人员使用 .net none,其中 asp.net 核心..这是我到目前为止所做的 注意:我是新手,在第一次尝试之前我没有使用过 AD

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; }
}

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

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

如果是这样,那么:

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

public IActionResult Find(string username)

然后您需要在过滤器中使用用户名。没有名为“用户名”的属性,但通常指的是 sAMAccountName。但是它也可以引用 userPrincipalName,其格式为 username@example.com。但我假设 sAMAccountName.

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

searcher.Filter = $"(&(objectClass=user)(objectCategory=person)(sAMAccountName={username}))";

默认情况下SearchScopeSubtree,所以你不需要这一行:

searcher.SearchScope = SearchScope.Subtree;

您还应该使用 PropertiesToLoad 集合,因为如果不这样做,它将 return 每个属性。所以只放你计划使用的属性:

searcher.PropertiesToLoad.Add("displayName");

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

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();
}

您可能仍然需要根据您的实际要求进行一些更新,但这应该可以帮助您入门。