如何通过AzureAD REST API按角色统计用户分布?
可以通过Azure AD REST API实现按角色统计用户分布
是的,完全可以通过Azure AD的REST API完成这个需求,不过API本身不支持直接的聚合统计,需要你获取数据后在本地做分组计数。具体步骤如下:
1. 获取目标应用的角色定义
首先调用GET /applications/{application-id}/appRoles接口,拿到该Web应用所有角色的id和对应的显示名称displayName,把它们存成一个映射表(键为角色ID,值为角色名称),方便后续匹配。
2. 查询所有分配了该应用角色的用户
使用GET /users?$expand=appRoleAssignments&$filter=appRoleAssignments/any(r: r/appId eq '{application-id}')接口,获取所有被分配了该应用角色的用户。这个请求会返回每个用户的详细信息,包括他们的应用角色分配记录。
如果用户数量较多,接口会返回分页标记@odata.nextLink,你需要循环调用直到获取所有用户数据。
3. 本地统计角色用户数量
遍历获取到的用户列表,对每个用户的appRoleAssignments进行检查,筛选出属于目标应用的角色分配记录,然后根据之前的映射表把角色ID转换成角色名称,最后按角色名称分组计数,就能得到你想要的结果。
伪代码示例:
// 构建角色ID到名称的映射 appRoles = GET /applications/{your-app-id}/appRoles roleIdToName = {} for role in appRoles: roleIdToName[role.id] = role.displayName // 获取所有关联目标应用角色的用户 users = [] nextLink = "https://graph.microsoft.com/v1.0/users?$expand=appRoleAssignments&$filter=appRoleAssignments/any(r: r/appId eq '{your-app-id}')" while nextLink: response = GET nextLink users.extend(response.value) nextLink = response.get("@odata.nextLink") // 统计每个角色的用户数 roleCounts = {} for user in users: for assignment in user.appRoleAssignments: if assignment.appId == "{your-app-id}": roleName = roleIdToName[assignment.roleId] roleCounts[roleName] = roleCounts.get(roleName, 0) + 1 // 输出结果 for role, count in roleCounts.items(): print(f"{role}: {count}")
权限要求
调用这些接口需要对应的权限:
User.Read.All:允许读取所有用户的信息Application.Read.All:允许读取应用的角色定义
内容的提问来源于stack exchange,提问作者Marko Taht
相关产品推荐
相关产品推荐

