【问题标题】:microsoft graph api sdk returns null user even when the user is there即使用户在那里,microsoft graph api sdk 也会返回 null 用户
【发布时间】:2021-04-07 01:13:54
【问题描述】:

我正在尝试通过电子邮件从租户获取用户。它在获取某些用户时有效,但在获取电子邮件地址中恰好有“+”的特定用户时不起作用。我不确定那个角色是问题还是其他问题。下面的查询始终为该用户返回 null。我的问题是,当用户显然在那个特定用户那里时,我如何弄清楚为什么它返回 null ?我检查了 AD B2C 租户中的审核日志,但它们只显示登录或删除。我在哪里可以检查图形 API 调用发生了什么?第二个问题,为什么要这样做?用户显然在那里!

   public static GraphServiceClient GetGraphServiceClient()
    {
        var clientapp = ConfidentialClientApplicationBuilder
            .Create(Globals.ClientId)
            .WithTenantId(Globals.TenantId)
            .WithClientSecret(Globals.ClientSecret)                
            .Build();
    
        ClientCredentialProvider authProvider = new ClientCredentialProvider(clientapp);
    
        return new GraphServiceClient(authProvider);
    }

 public static async Task<User> GetADUserAsyncByEmail(string email)
        {
            var graphClient = GetGraphServiceClient();
            try
            {
                Logger.Log(LogLevel.Trace, $"Contacting AD tenant {Globals.Tenant} for user {email}.");
                var users = await graphClient.Users
                            .Request()
                            .Filter($"identities/any(c:c/issuerAssignedId eq '{email}' and c/issuer eq '{Globals.Tenant}')")
                            .Select("displayName,id,userPrincipalName")
                            .GetAsync();
                Logger.Log(LogLevel.Trace, $"Finished contacting AD tenant {Globals.Tenant} for user {email}.");
                var foundUser = users.FirstOrDefault();
                return foundUser;
            }
            catch (ServiceException ex)
            {
                Logger.Log(LogLevel.Error, ex, $"Error Alert:Encountered an exception when trying to get AD User {email}.");
                return null;
            }
            catch (Exception ex)
            {
                Logger.Log(LogLevel.Error, ex, $"Error Alert:Encountered an exception when trying to get AD User {email}.");
                return null;
            }

        }

【问题讨论】:

  • 您好,您检查我的答案了吗?有更新吗?
  • 我做到了,虽然我还没有尝试过。我会相信你的话。

标签: microsoft-graph-api azure-ad-b2c


【解决方案1】:

看来微软graph对issuerAssignedId的处理并不完美。

它将请求 url 编码为 URL 编码格式,{email} 的内容被忽略。

尽管如此,它仍然可以为大多数未编码的符号返回正确的结果。例如,“*”。

“+”好像有点特殊,微软graph处理不好。

作为一种解决方法,您可以使用Uri.EscapeDataString 对电子邮件进行编码并将其放入过滤器中。

 var encodedEmail = Uri.EscapeDataString(email);

.Filter($"identities/any(c:c/issuerAssignedId eq '{encodedEmail}' and c/issuer eq '{Globals.Tenant}')")

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-07-07
    • 1970-01-01
    • 2020-09-26
    • 2016-08-05
    • 1970-01-01
    • 1970-01-01
    • 2013-04-02
    相关资源
    最近更新 更多