azure - 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();
我不知道缺少什么权限。
解决方案
我在我这边测试代码,并使用 fiddler 来捕获请求。似乎 sdk 请求Azure AD graph api而不是Microsoft graph api来列出服务主体。因此,您需要添加Directory.Read.All
AAD 图形的权限,而不是 Microsoft 图形的权限。请参考以下步骤:
添加权限后,不要忘记授予管理员同意。然后你就可以运行你的代码成功获取服务主体了。
顺便说一句,AAD 权限存在一个错误Directory.Read.All
。如果我们将AAD权限添加Directory.Read.All
到注册的应用程序中,那么即使我们从页面中删除它也无法删除该权限。因此,即使您Directory.Read.All
从页面上的“ API 权限”选项卡中删除,您仍然可以成功运行代码。
推荐阅读
- azure-active-directory - 按身份查询用户时,Issuer 是必需的还是被忽略的?
- r - R:彼此“堆叠”列
- python - 有人可以帮我解决这个问题吗?
- python - 如何在 python 中使用moviepy在不同时间戳的视频中添加多个文本剪辑?
- python - 如何仅从网页中抓取链接 - Python
- mysql - 在 MySQL 中使用 NOT IN 比较来自 2 个数据库的 2 列时出错?
- python - 将元组系列拆分为多列
- python - Django 必须不断更新支持的更新信息
- python - Pyglet (Python 3.9) 的持续错误
- javascript - 从函数返回数组值