Azure:服务主体的权限以获取服务主体列表

问题描述

我正在使用.NET的Fluent Azure SDK尝试获取租户中所有服务主体的列表。

var authenticatedContext = Azure.Authenticate(
     await SdkContext.AzureCredentialsFactory.FromServicePrincipal(aadClientId,aadClientSecret,tenantId,"AzureGlobalCloud")
);

var sps = authenticatedContext.ServicePrincipals.ListAsync().GetAwaiter().GetResults();

具有AAD客户端ID的服务主体具有Directory.Read.All API权限。 (请确保我没有丢失任何东西:我在Azure门户的ServicePrincipal->权限部分中看到了此权限)

但仍然会引发以下错误: Microsoft.Azure.Management.Graph.RBAC.Fluent.Models.GraphErrorException:操作返回无效的状态码“禁止

但是,获取ADGroup的标注和订阅列表有效

var subs = authenticatedContext.Subscriptions.ListAsync().GetAwaiter().GetResults();

var sgs = authenticatedContext.Subscriptions.ActiveDirectoryGroups().GetByIdAsync(someId).GetAwaiter().GetResults();

我不知道缺少什么权限。

解决方法

我在一边测试代码,然后使用提琴手捕获请求。似乎sdk请求 Azure AD图形api ,而不是 Microsoft图形api 列出服务主体。因此,您需要添加AAD图的权限Directory.Read.All,而不是Microsoft图的权限。请参考以下步骤:

enter image description here

enter image description here

添加许可后,请不要忘记授予管理员许可。然后,您可以成功运行代码以获取服务主体。

顺便说一句,有一个具有AAD权限Directory.Read.All的错误。如果我们将AAD权限Directory.Read.All添加到已注册的应用中,则即使我们从页面中将其删除,也无法删除该权限。因此,即使您从页面的“ API权限”标签中删除了Directory.Read.All,您仍然可以成功运行代码。