通过 Graph api 检索分配给应用程序的应用程序角色时得到不一致的结果
Getting inconsistent results when retrieving app roles assigned to an app via Graph api
相关包版本:
- Microsoft.EntityFrameworkCore: 3.1.9
- Microsoft.Graph: 3.28
我将用几个例子来说明这些不一致之处:
正在使用 powershell 脚本检索组
此处提供了获取组的脚本:显示分配给应用程序代理应用程序的用户和组
.
返回的唯一组:157
备注: 组数以及 object id 对应于我在 Azure Active Directory[=71= 上看到的列表] blade 在 Azure 门户 上,所以我将其用作其他方法的参考。
使用 App Id 通过 .NET core 获取群组
await graphServiceClient.ServicePrincipals.Request().Filter($"appId eq '{appId}'").Expand("AppRoleAssignedTo");
返回的唯一组:101
备注:我无法确定为什么某些组未返回。为了确认权限问题不是造成差异的原因,我尝试使用 object 缺失组的 ID 手动检索组,如下所示:
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
不寻常的是,虽然我能够使用这种方法检索更多组,但它实际上无法检索通过 应用程序 Id/Service 主体 获得的某些组方法。将它们加在一起,得到 146
的总和
出于保密原因,很遗憾,我无法透露这些组的具体信息或它们各自的内容,但每个缺失的组中都有成员,并且至少分配了一个 AppRole。
事实证明方法是正确的,库版本已经过时了。使用 Microsoft.Graph: 4.15,我可以使用上述任何方法获取所需的组。
相关包版本:
- Microsoft.EntityFrameworkCore: 3.1.9
- Microsoft.Graph: 3.28
我将用几个例子来说明这些不一致之处:
正在使用 powershell 脚本检索组
此处提供了获取组的脚本:显示分配给应用程序代理应用程序的用户和组 .
返回的唯一组:157
备注: 组数以及 object id 对应于我在 Azure Active Directory[=71= 上看到的列表] blade 在 Azure 门户 上,所以我将其用作其他方法的参考。
使用 App Id 通过 .NET core 获取群组
await graphServiceClient.ServicePrincipals.Request().Filter($"appId eq '{appId}'").Expand("AppRoleAssignedTo");
返回的唯一组:101
备注:我无法确定为什么某些组未返回。为了确认权限问题不是造成差异的原因,我尝试使用 object 缺失组的 ID 手动检索组,如下所示:
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
不寻常的是,虽然我能够使用这种方法检索更多组,但它实际上无法检索通过 应用程序 Id/Service 主体 获得的某些组方法。将它们加在一起,得到 146
的总和出于保密原因,很遗憾,我无法透露这些组的具体信息或它们各自的内容,但每个缺失的组中都有成员,并且至少分配了一个 AppRole。
事实证明方法是正确的,库版本已经过时了。使用 Microsoft.Graph: 4.15,我可以使用上述任何方法获取所需的组。