![](/img/trans.png)
[英]Getting Azure Active Directory groups in asp.net core project
[英]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; }
}
您的要求有点不清楚,但我假设:
displayName
传递给您的视图如果是这样的话,那么:
首先,由于您只需将单个字符串传递到 controller 中,因此使用 class 作为参数没有任何好处。 只需使用一个字符串:
public IActionResult Find(string username)
然后,您需要在过滤器中使用用户名。 没有称为“用户名”的属性,但通常指的是sAMAccountName
。 但是它也可以引用userPrincipalName
,其格式为username@example.com
。 但我会假设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();
}
您可能仍需要根据您的实际要求进行一些更新,但这应该可以帮助您入门。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.