AAD B2C:按主体名称搜索用户

问题描述 投票:0回答:2

我已按照文档通过登录名查找注册用户。

示例显示以下代码,用于返回具有登录名的任何用户

[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

更多来源

.net azure azure-active-directory microsoft-graph-api microsoft-graph-sdks
2个回答
1
投票

请注意,目前

任何 MS Graph 查询均不支持 
contains 运算符,有一个使用
startsWith
的解决方法。

用于查找

identities
属性的 Microsoft Graph 实现仅限于提供
issuerAssignedId
issuer
的精确值。

我实施的解决方法是将

issuerAssignedId
保留在附加扩展属性中。如果您使用自定义策略,这相对容易实现。但如果您使用用户流,则很容易出错,因为没有直接的方法将此值记录为附加属性。基本上,您必须不断在 MS Graph 中查询(最多是增量!)用户,并根据 IssuerAssignedId 更新自定义属性。


0
投票

我使用以下代码通过用户名或登录电子邮件获取用户来查询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();
  }

希望有帮助。 亲切的问候

© www.soinside.com 2019 - 2024. All rights reserved.