Microsoft graph api 即使用户存在,microsoft graph api sdk也会返回空用户

Microsoft graph api 即使用户存在,microsoft graph api sdk也会返回空用户,microsoft-graph-api,azure-ad-b2c,Microsoft Graph Api,Azure Ad B2c,我正在尝试通过电子邮件从租户处获取用户。它在获取某些用户时有效,但在获取电子邮件地址中碰巧有“+”的特定用户时无效。我不确定这个角色是问题还是其他原因。下面的查询对于该用户总是返回null。我的问题是,当用户显然在那里等待特定用户时,我如何找出它为什么返回null?我检查了AD B2C租户中的审计日志,但它们只显示登录或删除。在哪里可以检查graph API调用发生了什么?第二个问题,为什么会这样做?用户显然在那里 public static GraphServiceClient GetG

我正在尝试通过电子邮件从租户处获取用户。它在获取某些用户时有效,但在获取电子邮件地址中碰巧有“+”的特定用户时无效。我不确定这个角色是问题还是其他原因。下面的查询对于该用户总是返回null。我的问题是,当用户显然在那里等待特定用户时,我如何找出它为什么返回null?我检查了AD B2C租户中的审计日志,但它们只显示登录或删除。在哪里可以检查graph 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;
            }

        }
publicstaticgraphserviceclient GetGraphServiceClient()
{
var clientapp=机密客户端应用程序生成器
.Create(Globals.ClientId)
.WithTenantId(Globals.TenantId)
.WithClientSecret(Globals.ClientSecret)
.Build();
ClientCredentialProvider authProvider=新的ClientCredentialProvider(clientapp);
返回新的GraphServiceClient(authProvider);
}
公共静态异步任务GetADUserAsyncByEmail(字符串电子邮件)
{
var graphClient=GetGraphServiceClient();
尝试
{
Log(LogLevel.Trace,$“为用户{email}联系AD租户{Globals.tenant}”);
var users=wait graphClient.users
.Request()
.Filter($“Identifications/any(c:c/issuerasignedid eq'{email}'和c/issuer eq'{Globals.Tenant}'))
.选择(“displayName、id、userPrincipalName”)
.GetAsync();
Logger.Log(LogLevel.Trace,$“已为用户{email}联系AD租户{Globals.tenant}”);
var foundUser=users.FirstOrDefault();
返回用户;
}
捕获(ServiceException ex)
{
Log(LogLevel.Error,ex,$“错误警报:尝试获取AD用户{email}时遇到异常”;
返回null;
}
捕获(例外情况除外)
{
Log(LogLevel.Error,ex,$“错误警报:尝试获取AD用户{email}时遇到异常”;
返回null;
}
}

看来Microsoft graph对
issuerasignedid
的处理并不完美

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

然而,对于大多数尚未编码的符号,它仍然可以返回正确的结果。例如,“*”

“+”似乎有点特殊,Microsoft graph无法很好地处理它

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

 var encodedEmail = Uri.EscapeDataString(email);


嗨,你检查我的答案了吗?有更新吗?我有,虽然我还没试过。我相信你的话。
.Filter($"identities/any(c:c/issuerAssignedId eq '{encodedEmail}' and c/issuer eq '{Globals.Tenant}')")