【发布时间】: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)
标签: c# azure-ad-b2c