c# - Angular 7 中的活动目录查找
问题描述
我正在使用角度反应形式的输入搜索字段来查找 AD 用户。因此,当您开始输入您的姓名时,您应该获得该字段的一些自动完成选项。为此,我从我的 Angular 应用程序中调用了一个 web api 方法,该方法又返回给我一个用户列表。我将该用户列表绑定到输入字段数据列表。我在我的网络 api 中使用以下代码:-
public List<string> ADUsers()
{
List<string> users = new List<string>();
using (var context = new PrincipalContext(ContextType.Domain, "abc.in"))
{
using (var searcher = new PrincipalSearcher(new UserPrincipal(context)))
{
foreach (var result in searcher.FindAll())
{
DirectoryEntry de = result.GetUnderlyingObject() as DirectoryEntry;
if(de.Properties["givenName"].Value != null && de.Properties["sn"].Value != null)
users.Add(de.Properties["givenName"].Value + " " + de.Properties["sn"].Value);
}
}
}
return users;
}
由于用户数量过多,将列表返回到 angular(20-25 秒) 需要时间,这反过来需要时间来反映在反应形式的输入字段中。我是 Angular 新手,基本上是 .net 开发人员。您能否提出一些方法来找出一些响应式解决方案?或者是否有可能在角度本身具有功能,以便我不应该为此调用 web api 方法?
解决方案
我在您的代码中看到了几个问题:
- 您没有过滤用户。因此,此代码每次运行时都会查找域中的每个用户。您可以通过使用用户已经输入的文本作为过滤器来更改此设置,并通过限制返回的结果数量(在自动完成控件中显示 100 多个名称是没有意义的)
PrincipalSearcher
,并且整个System.DirectoryServices.AccountManagement
命名空间效率不是很高。例如,在这种情况下,它会为在后台找到的每个结果加载每个属性,即使您只使用名字和姓氏。您可以通过直接使用命名空间来做得更好System.DirectoryServices
(DirectorySearcher
/DirectoryEntry
,无论如何这都是AccountManagement
命名空间在幕后使用的)。
这是一个应该适用于您的情况的示例:
public List<string> ADUsers(string filter) {
if (string.IsNullOrEmpty(filter)) throw new ArgumentNullException(nameof(filter));
List<string> users = new List<string>();
var ds = new DirectorySearcher(
new DirectoryEntry("LDAP://abc.in"), //domain to search
$"(&(objectClass=user)(anr={filter}))", //search filter
new[] { "givenName", "sn" }) //attributes to load
{
SizeLimit = 25 //change this depending on how many you want to show
};
using (var results = ds.FindAll()) {
foreach (SearchResult result in results) {
users.Add($"{result.Properties["givenName"][0]} {result.Properties["sn"][0]}");
}
}
return users;
}
您可以将任何部分名称作为 传递给它filter
,它使用 AD 中称为歧义名称解析的功能来查找用户。这将在名字、姓氏和其他属性(该文档中的完整列表)中查找部分匹配项。
我还将结果限制为 25,但您可以随意更改。
此方法还告诉 AD仅返回每个结果的givenName
andsn
属性,因为这就是我们所关心的。这将减少您的应用程序和域控制器之间的网络流量。
推荐阅读
- ios - 适合多级/屏幕游戏的场景套件架构
- file - UWP 打开文件问题
- excel - 函数属性数据透视表类
- date - 如何在一个应用程序中连贯地使用 RRULE 日期时间序列和任意的非 RRULE 日期时间序列
- android - Android 10:IMEI 在 API 29 上不再可用。寻找替代品
- java - 当我加载 openSourceBim IfcModelService 时,它总是为空
- ios - Xcode 11 无法将 Info.plist 重新分配到一个组中
- prisma - 使用 nexus 在 Prisma2 中公开总页数的最佳方法是什么?
- amazon-web-services - 如何找到离特定网站最近的 EC2 可用区
- java - 如何使用 SSLPoke 强制 TLS1.2