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; }
}
您的要求有点不清楚,但我假设:
- 您想将用户名传递给您的控制器
- 在 AD 中找到该用户,
- 将找到的用户的
displayName
传递到您的视图
如果是这样,那么:
首先,由于您只需要将单个字符串传递到控制器中,因此使用 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
集合,因为如果不这样做,它将 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();
}
您可能仍然需要根据您的实际要求进行一些更新,但这应该可以帮助您入门。
我之前已经发布了一个问题并且 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; }
}
您的要求有点不清楚,但我假设:
- 您想将用户名传递给您的控制器
- 在 AD 中找到该用户,
- 将找到的用户的
displayName
传递到您的视图
如果是这样,那么:
首先,由于您只需要将单个字符串传递到控制器中,因此使用 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
集合,因为如果不这样做,它将 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();
}
您可能仍然需要根据您的实际要求进行一些更新,但这应该可以帮助您入门。