繁体   English   中英

Asp.net 内核中的 Active Directory

[英]Active Directory in Asp.net core

我之前已经发布了一个问题并且没有答案,所以我认为我必须为我的问题添加更多信息,所以我的问题是我不知道如何从 AD 搜索用户我试图找到解决方案但大多数开发人员都没有成功使用 .net 没有一个使用 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. 您想将用户名传递给您的 controller
  2. 在 AD 中找到该用户,
  3. 将找到的用户的displayName传递给您的视图

如果是这样的话,那么:

首先,由于您只需将单个字符串传递到 controller 中,因此使用 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}))";

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM