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