首页 > 解决方案 > Azure:服务主体获取服务主体列表的权限

问题描述

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

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: Operation return an invalid status code 'Forbidden'

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

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

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

我不知道缺少什么权限。

标签: azureazure-ad-graph-apiazure-sdk-.netazure-sdk

解决方案


我在我这边测试代码,并使用 fiddler 来捕获请求。似乎 sdk 请求Azure AD graph api而不是Microsoft graph api来列出服务主体。因此,您需要添加Directory.Read.AllAAD 图形的权限,而不是 Microsoft 图形的权限。请参考以下步骤:

在此处输入图像描述

在此处输入图像描述

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

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


推荐阅读