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

Azure : Permission for Service Principal to get list of Service Principals

我正在使用适用于 .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 -> Permissions 部分看到了这个权限)

但仍然会抛出以下错误: Microsoft.Azure.Management.Graph.RBAC.Fluent.Models.GraphErrorException: 操作 return 一个无效的状态码 'Forbidden'

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

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

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

我不知道缺少什么权限。

我这边测试代码,用fiddler抓请求。似乎 sdk 请求 Azure AD graph api 而不是 Microsoft graph api 来列出服务主体。所以你需要添加权限 Directory.Read.All AAD graph 而不是 Microsoft graph。请参考以下步骤:

添加权限后,不要忘记授予管理员同意。然后你可以运行你的代码成功获取服务主体。

顺便说一下,AAD 权限有一个错误 Directory.Read.All。如果我们在注册的应用中添加AAD权限Directory.Read.All,那么即使我们从页面中删除它也无法删除该权限。因此,即使您从页面上的“API 权限”选项卡中删除 Directory.Read.All,您仍然可以 运行 代码成功。