azure-graph Users.get(principalID) throws Request_ResourceNo



我试图通过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线程密切相关,所以在这里引用它是为了帮助将来阅读本文的人了解上下文。

最新更新