问题描述
我正在使用.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:操作返回无效的状态码“禁止”
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图的权限。请参考以下步骤:
添加许可后,请不要忘记授予管理员许可。然后,您可以成功运行代码以获取服务主体。
顺便说一句,有一个具有AAD权限Directory.Read.All
的错误。如果我们将AAD权限Directory.Read.All
添加到已注册的应用中,则即使我们从页面中将其删除,也无法删除该权限。因此,即使您从页面的“ API权限”标签中删除了Directory.Read.All
,您仍然可以成功运行代码。