我已按照文档通过登录名查找注册用户。
示例显示以下代码,用于返回具有登录名的任何用户
[email protected]
:
var users = await graphClient.Users
.Request()
.Filter("identities/any(c:c/issuerAssignedId eq '[email protected]' and c/issuer eq 'contoso.onmicrosoft.com')")
.GetAsync();
现在我正在尝试实现一个搜索,该搜索应该搜索用户而无需输入完整的
signInName
。由于过滤器似乎是 OData,因此我尝试使用 contains
方法来增强它:
var users = await graphClient.Users
.Request()
.Filter($"identities/any(c:contains(c/issuerAssignedId,'j.smith') and c/issuer eq 'contoso.onmicrosoft.com') ")
.Top(5)
.GetAsync();
现在,当我运行这个新查询时,我收到以下错误:
Status Code: BadRequest
Microsoft.Graph.ServiceException: Code: Request_BadRequest
Message: An unknown function with name 'contains' was found. This may also be a key lookup on a navigation property, which is not allowed.
我是否在某个地方写错了或者
contains
不允许?我不认为 issuerAssignedId
是查找或导航属性。由于我正在使用 Azure AD B2C,$search
功能也无法根据相同的文档页面工作,所以我现在陷入困境。
Azure AD B2C 中如何搜索用户?
我在 StackOverflow 上发现了另外两篇文章讨论这个问题,但它们已经很老了。在其中一个中,一位 Microsoft 员工指出可以使用
startswith
运算符。
我尝试过这样实现,但它也会引发错误。
.Filter($"identities/any(a:startswith(a/issuerAssignedId,'{username}') and a/issuer eq '{issuer}') ")
Status Code: BadRequest
Microsoft.Graph.ServiceException: Code: Request_BadRequest
Message: Unsupported property or property value or combination of property and operation occured
更多来源:
请注意,目前
任何 MS Graph 查询均不支持
contains
运算符,有一个使用 startsWith
的解决方法。
用于查找
identities
属性的 Microsoft Graph 实现仅限于提供 issuerAssignedId
和 issuer
的精确值。
我实施的解决方法是将
issuerAssignedId
保留在附加扩展属性中。如果您使用自定义策略,这相对容易实现。但如果您使用用户流,则很容易出错,因为没有直接的方法将此值记录为附加属性。基本上,您必须不断在 MS Graph 中查询(最多是增量!)用户,并根据 IssuerAssignedId 更新自定义属性。
我使用以下代码通过用户名或登录电子邮件获取用户来查询Azure AD B2C。
string usernameOrEmail = "[email protected]";
string aadB2CIssuerDomain = "yourtenant.onmicrosoft.com";
public async Task<User[]> GetGraphApiUsersByUsernameEmail(string usernameOrEmail)
{
var users = await _graphServiceClient
.Users
.GetAsync(requestConfiguration =>
{
requestConfiguration.QueryParameters.Filter = $"identities/any(c:c/issuerAssignedId eq '{usernameOrEmail}' and c/issuer eq '{aadB2CIssuerDomain}')";
});
foreach (var user in users.Value.ToList().Select(e => new
{
e.DisplayName,
e.Id,
e.Identities,
e.Mail,
e.UserPrincipalName,
}))
{
Console.WriteLine(JsonConvert.SerializeObject(user));
}
return users?.Value.ToArray();
}
希望有帮助。 亲切的问候