使用 Graph SDK 过滤用户的传递组成员身份
Filtering the transitive group memberships of a user using Graph SDK
我正在尝试使用适用于 C# 的 MS Graph SDK(测试版)来获取用户所属的所有组,并使用过滤器仅获取“安全组”。
我的代码如下所示:
var upn = "some.body@org.com";
var request = await _graphClient.Users[upn].TransitiveMemberOf
.Request()
.Filter("securityEnabled eq true")
.GetAsync();
当我运行这段代码时,我得到一个错误The specified filter to the reference property query is currently not supported
。我知道使用具有相同过滤器的 Postman 可以成功调用相同的 API 端点 所以我假设我的 C# 代码中遗漏了一些东西?
请使用以下代码使用 graph sdk 在 c# 中过滤 securityEnabled
try
{
List<Option> requestOptions = new List<Option>();
requestOptions.Add(new QueryOption("$count", "true"));
var request = await graphClient.Users["sruthi@xx.live"].TransitiveMemberOf
.Request(requestOptions).Header("ConsistencyLevel", "eventual")
.Filter("securityEnabled eq true")
.GetAsync();
Console.WriteLine(JsonConvert.SerializeObject(request));
}
catch(Exception e)
{
Console.WriteLine(e.Message);
}
多亏了 Sruthi 的回答,我才能够获得用户可传递的成员资格。显然,这通常会产生一个巨大的列表,而图表 API 只会为您提供分页响应,因此您必须循环浏览每一页才能获得所有内容。
这就是代码现在的样子:
public async Task<List<Group>> ListTransitiveGroupMembershipsOfUserAsync(string upn)
{
var requestOptions = new List<Option>
{
new QueryOption("$count", "true")
};
var directoryObjects = new List<DirectoryObject>();
var request = await _graphClient.Users[upn].TransitiveMemberOf
.Request(requestOptions).Header("ConsistencyLevel", "eventual")
.Filter("securityEnabled eq true")
.GetAsync();
directoryObjects.AddRange(request.CurrentPage);
while (request.NextPageRequest != null)
{
var currentHeaders = request.NextPageRequest.Headers;
IUserTransitiveMemberOfCollectionWithReferencesPage newPage;
if (!currentHeaders.Any())
request = await request.NextPageRequest.Header("ConsistencyLevel", "eventual").GetAsync();
else
request = await request.NextPageRequest.GetAsync();
directoryObjects.AddRange(request.CurrentPage);
}
return directoryObjects.Cast<Group>().ToList();
}
最初,我的代码在尝试获取第 2 页以后的结果时失败了,因为它一直将 eventual
附加到 ConsistencyLevel
header。因此,当发送第 2 页的 HTTP 请求时,header 类似于:第 3 页的 ConsistencyLevel: eventual, eventual
或 ConsistencyLevel: eventual, eventual, eventual
,依此类推。
为了解决这个问题,我添加了小 if (!currentHeaders.Any())
块以仅添加 ConsistencyLevel
header(如果它尚不存在)。
希望这能帮助那些因循环浏览分页回复而被抓到的人!
我正在尝试使用适用于 C# 的 MS Graph SDK(测试版)来获取用户所属的所有组,并使用过滤器仅获取“安全组”。
我的代码如下所示:
var upn = "some.body@org.com";
var request = await _graphClient.Users[upn].TransitiveMemberOf
.Request()
.Filter("securityEnabled eq true")
.GetAsync();
当我运行这段代码时,我得到一个错误The specified filter to the reference property query is currently not supported
。我知道使用具有相同过滤器的 Postman 可以成功调用相同的 API 端点 所以我假设我的 C# 代码中遗漏了一些东西?
请使用以下代码使用 graph sdk 在 c# 中过滤 securityEnabled
try
{
List<Option> requestOptions = new List<Option>();
requestOptions.Add(new QueryOption("$count", "true"));
var request = await graphClient.Users["sruthi@xx.live"].TransitiveMemberOf
.Request(requestOptions).Header("ConsistencyLevel", "eventual")
.Filter("securityEnabled eq true")
.GetAsync();
Console.WriteLine(JsonConvert.SerializeObject(request));
}
catch(Exception e)
{
Console.WriteLine(e.Message);
}
多亏了 Sruthi 的回答,我才能够获得用户可传递的成员资格。显然,这通常会产生一个巨大的列表,而图表 API 只会为您提供分页响应,因此您必须循环浏览每一页才能获得所有内容。
这就是代码现在的样子:
public async Task<List<Group>> ListTransitiveGroupMembershipsOfUserAsync(string upn)
{
var requestOptions = new List<Option>
{
new QueryOption("$count", "true")
};
var directoryObjects = new List<DirectoryObject>();
var request = await _graphClient.Users[upn].TransitiveMemberOf
.Request(requestOptions).Header("ConsistencyLevel", "eventual")
.Filter("securityEnabled eq true")
.GetAsync();
directoryObjects.AddRange(request.CurrentPage);
while (request.NextPageRequest != null)
{
var currentHeaders = request.NextPageRequest.Headers;
IUserTransitiveMemberOfCollectionWithReferencesPage newPage;
if (!currentHeaders.Any())
request = await request.NextPageRequest.Header("ConsistencyLevel", "eventual").GetAsync();
else
request = await request.NextPageRequest.GetAsync();
directoryObjects.AddRange(request.CurrentPage);
}
return directoryObjects.Cast<Group>().ToList();
}
最初,我的代码在尝试获取第 2 页以后的结果时失败了,因为它一直将 eventual
附加到 ConsistencyLevel
header。因此,当发送第 2 页的 HTTP 请求时,header 类似于:第 3 页的 ConsistencyLevel: eventual, eventual
或 ConsistencyLevel: eventual, eventual, eventual
,依此类推。
为了解决这个问题,我添加了小 if (!currentHeaders.Any())
块以仅添加 ConsistencyLevel
header(如果它尚不存在)。
希望这能帮助那些因循环浏览分页回复而被抓到的人!