我试图通过Node.js获取资源组的IAM列表。返回的列表包含用户id而不是用户名,所以我试图通过用户id获取用户名。
const authorizationManagement = require('azure-arm-authorization');
const GraphkManagementClient = require('azure-graph');
const authorizationClient = new authorizationManagement(credentials, subscriptionId);
const graphClient = new GraphkManagementClient(credentials, tenantId);
let iamList = client.roleAssignments.listForResourceGroup(workspaceName);
for (let i in iamList) {
const user = graphClient.users.get(iamList[i].principalId);
iamList[i].principalId = user;
}
return iamList;
但这条线:
const user = graphClient.users.get(iamList[i].principalId);
投掷:
Request_ResourceNotFound:消息:"资源"b175c95c-e50f-5c46-0b0d-d9f7106d0873"不存在或其查询的引用属性对象不存在。">
角色分配本身由以下组成:
- 安全主体Id(用户、组、服务主体等,无论您向其分配角色)
- 角色定义Id(您分配的角色的标识符,如参与者、所有者或自定义RBAC角色)
- 作用域(分配此角色的位置,如订阅级别或特定资源组)
这个概念在Microsoft Docs 上有详细的解释,非常好
当获取像这里所讨论的角色分配列表时,响应对象包含prinicipalId
,但不包含principalType
,以指示它是用户、组、服务主体还是MSI。因此,查询该主体的一种安全方法是不采用任何特定类型,只需查找具有该Id的对象。
azure-graph
中提供的getObjectsByObjectIds
方法(文档)可以帮助实现这一点。在后台使用的Azure AD Graph API可能是getObjectsByObjectIds
作为一个侧节点,值得一提的是,这个问题与另一个SO线程密切相关,所以在这里引用它是为了帮助将来阅读本文的人了解上下文。