相关软件包版本:
- Microsoft.EntityFrameworkCore:3.1.9
- Microsoft.Graph:3.28
我将用几个例子来说明不一致的地方:
使用 powershell 脚本检索组
此处提供了获取组的脚本:显示分配给应用程序代理应用程序的用户和组 。
返回的唯一组:157
备注:组数和对象 id 对应于我可以在Azure 门户上的Azure Active Directory刀片上看到的那些,因此我将其用作其他方法的参考。
使用 App Id 通过 .NET 核心获取组
await graphServiceClient.ServicePrincipals.Request().Filter($"appId eq '{appId}'").Expand("AppRoleAssignedTo");
返回的唯一组:101
备注:我无法确定为什么某些组没有返回。为了确认权限问题不是造成差异的原因,我尝试使用缺失组的 objectIds 手动检索组,如下所示:
var group = await graphServiceClient.Groups[id].Request().Expand("AppRoleAssignments").GetAsync();
do
{
assignments.AddRange(group.AppRoleAssignments.CurrentPage.ToList().Where(x => x.ResourceId.ToString().Equals(appServicePrincipalId)).ToList());
} while (group.AppRoleAssignments.NextPageRequest != null);
我能够使用这种方法成功检索丢失的组。
使用服务主体通过 .NET 核心获取组
为了通过,我将 appId 方法与依赖于服务主体的方法进行了如下交换,但结果与 AppId 相同。
await graphServiceClient.ServicePrincipals[appServicePrincipalId].AppRoleAssignedTo.Request().GetAsync()
返回的唯一组:101
通过使 powershell 脚本适应 .NET 来检索组
var tx = await graphServiceClient.Groups.Request().Expand("AppRoleAssignments").GetAsync()
do
{
foreach (var group in tx)
{
do
{
assignments.AddRange(group.AppRoleAssignments.CurrentPage.ToList().Where(x => x.ResourceId.ToString().Equals(appServicePrincipalId)).ToList());
if (group.AppRoleAssignments.NextPageRequest != null)
{
group.AppRoleAssignments = await group.AppRoleAssignments.NextPageRequest.GetAsync();
}
} while (group.AppRoleAssignments.NextPageRequest != null);
}
tx = await tx.NextPageRequest.GetAsync();
} while (tx.NextPageRequest != null);
这里的方法是遍历所有组,然后过滤具有正确服务主体 ID 的组。
返回的唯一组:136
不同寻常的是,虽然我能够使用这种方法检索更多组,但它实际上无法检索通过App Id/Service 主体方法获得的某些组。将两者加起来,总共有146个
由于保密原因,很遗憾,我无法透露组的具体信息或各自的内容,但每个缺失的组都有成员,并且至少分配了一个AppRole。