我们正在使用B2C并将客户编号存储为用户的扩展字段。单个用户可以拥有一个或多个客户,并且它们存储在逗号分隔的字符串中。
我现在正在做的事情非常低效: 1.获取所有用户 2.获取每个用户的扩展属性 3.检查它们是否具有所需的扩展属性,以及它是否包含我想要的客户。 4.构建我想要的用户列表。
Adclient是IActiveDirectoryClient
var users = (await GetAllElementsInPagedCollection(await AdClient.Users.ExecuteAsync())).ToList();
var customersUsers = users.Where(user => user.AccountEnabled.HasValue && user.AccountEnabled.Value).Where(user =>
{
var extendedProperty = ((User) user).GetExtendedProperties().FirstOrDefault(extProp => extProp.Key == customersExtendedProperty.Name).Value?.ToString();
return extendedProperty != null && extendedProperty.Contains(customerId);
}).ToList();
我希望能够使用AdClient在ActiveDirectory的一个查询中执行此操作。如果我尝试这个,我会得到错误,不支持这些方法,这是有道理的,因为我假设在后台构建查询以查询Active Directory。
编辑 - 其他信息:
我能够像这样查询Graph API:
var authContext = await ActiveDirectoryClientFactory.GetAuthenticationContext(AuthConfiguration.Tenant,
AuthConfiguration.GraphUrl, AuthConfiguration.ClientId, AuthConfiguration.ClientSecret);
var url = $"https://graph.windows.net:443/hansaborgb2c.onmicrosoft.com/users?api-version=1.6&$filter={customersExtendedProperty.Name} eq '{customerId}'";
var users = await _graphApiHttpService.GetAll<User>(url, authContext.AccessToken);
但是,在我的示例中,我需要使用 substringof 进行过滤,但Azure Graph API不支持此功能。
答案 0 :(得分:4)
我没有使用该库,但我们正在使用Graph API进行非常类似的搜索。我构建了一个过滤器,用于查找匹配我正在寻找的两个扩展属性值的用户。过滤器如下所示:
var filter = $"$filter={idpExtensionAttribute} eq '{userType.ToString()}' and {emailExtensionAttribute} eq '{emailAddress}'";
我们还通过PowerShell使用REST调用Graph API来返回所需的用户。带有关联过滤器的URI如下所示:
https://graph.windows.net/$AzureADDomain/users?`$filter=extension_d2fbadd878984184ad5eab619d33d016_idp eq '$idp' and extension_d2fbadd878984184ad5eab619d33d016_email eq '$email'&api-version=1.6
这两个选项都将返回符合过滤条件的所有用户。
答案 1 :(得分:3)
我会使用System.DirectoryServices中的普通DirectorySearcher类
private void Search()
{
// GetDefaultDomain as start point is optional, you can also pass a specific
// root object like new DirectoryEntry ("LDAP://OU=myOrganisation,DC=myCompany,DC=com");
// not sure if GetDefaultDomain() works in B2C though :(
var results = FindUser("extPropName", "ValueYouAreLookingFor", GetDefaultDomain());
foreach (SearchResult sr in results)
{
// query the other properties you want for example Accountname
Console.WriteLine(sr.Properties["sAMAccountName"][0].ToString());
}
Console.ReadKey();
}
private DirectoryEntry GetDefaultDomain()
{ // Find the default domain
using (var dom = new DirectoryEntry("LDAP://rootDSE"))
{
return new DirectoryEntry("LDAP://" + dom.Properties["defaultNamingContext"][0].ToString());
}
}
private SearchResultCollection FindUser(string extPropName, string searchValue, DirectoryEntry startNode)
{
using (DirectorySearcher dsSearcher = new DirectorySearcher(startNode))
{
dsSearcher.Filter = $"(&(objectClass=user)({extPropName}={searchValue}))";
return dsSearcher.FindAll();
}
}
答案 2 :(得分:0)
我看到这篇文章,希望检索具有特定自定义属性值的所有用户。这是我最终的实现:
var filter = $"{userOrganizationName} eq '{organizationName}'";
// Get all users (one page)
var result = await graphClient.Users
.Request()
.Filter(filter)
.Select($"id,surname,givenName,mail,{userOrganizationName}")
.GetAsync();
其中 userOrganizationName 是 b2c_extension 的完整属性名称。