通过用户的自定义属性搜索 Active Directory B2C

Posted

技术标签:

【中文标题】通过用户的自定义属性搜索 Active Directory B2C【英文标题】:Searching Active Directory B2C by custom property on User 【发布时间】:2018-03-30 03:18:24 【问题描述】:

我们使用 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 不支持此功能。

【问题讨论】:

当你说“扩展”字段时,它是一个扩展属性,其名称格式为“extension_guid_someName”吗?以及如何将扩展属性放在用户帐户上?是通过 Graph API 吗? (即用户由AD B2C创建,然后使用Graph API更新?) 是的,扩展字段是指具有该格式的扩展属性。它们是使用图形 API 创建的,或者更准确地说,我使用的是 ActiveDirectoryClient 类,我假设这是在后台使用图形 API 是的,ActiveDirectoryClient 封装了 Graph API。您可以通过 ActiveDirectoryClient.Context.ExecuteAsync 访问原始接口以执行来自@nboettcher 答案的查询。但是,有一个问题:$filter 不支持 'contains' 操作,只支持 'startswith' 和 'any' 用于多值属性(并且不能创建多值扩展属性) :( 或许未来还有希望(但不在 Azure AD Graph API 中 - 微软宣布转向 Microsoft Graph API) 【参考方案1】:

我没有使用那个库,但我们正在使用 Graph API 进行非常相似的搜索。我已经构建了一个过滤器,它将寻找与我正在寻找的两个扩展属性值匹配的用户。过滤器如下所示:

var filter = $"$filter=idpExtensionAttribute eq 'userType.ToString()' and emailExtensionAttribute eq 'emailAddress'";

我们还通过 PowerShell 对将返回所需用户的 Graph API 使用 REST 调用。带有关联过滤器的 URI 如下所示:

https://graph.windows.net/$AzureADDomain/users?`$filter=extension_d2fbadd878984184ad5eab619d33d016_idp eq '$idp' and extension_d2fbadd878984184ad5eab619d33d016_email eq '$email'&api-version=1.6

这两个选项都将返回任何符合过滤条件的用户。

【讨论】:

终于有时间测试这个了,我设法查询了扩展属性,但是我发现你不能在一个属性中搜索它的部分字符串(子字符串),你知道吗为此?【参考方案2】:

我会使用 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();
    

【讨论】:

【参考方案3】:

我看到这篇文章是为了检索具有特定自定义属性值的所有用户。这是我最终得到的实现:

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 的完整属性名称。

【讨论】:

以上是关于通过用户的自定义属性搜索 Active Directory B2C的主要内容,如果未能解决你的问题,请参考以下文章

通过编写添加新类的自定义指令来更改“router-link-active”类的默认名称

按日期时间自定义属性搜索 Active Directory (AD LDS)

Rails 5.2 Active Storage 添加自定义属性

Active Directory - 检查用户名/密码

mysql通过在同一张表上查询的自定义顺序

如何填充 Azure Active Directory B2C 用户自定义用户属性?