使用 Graph Api 对租户进行角色计数

Role Count using Graph Api against a tenant

有没有办法找到每个 role 存在于 tenantnumber of users 中,这些 role 使用 GraphServiceClient 或分配给每个 role GraphConnectionclass?我正在使用 C#。

目录角色 - 查找租户的所有目录角色及其成员数量

我已经为 Microsoft Graph API (https://graph.microsoft.com) as well as Azure AD Graph API (https://graph.windows.net) 提供了示例代码,但强烈建议使用较新的 Microsoft Graph API 除非您有特定的要求无法从中获取,然后才查看 Azure AD Graph API。

在这里查看更详细的比较Microsoft Graph or Azure AD Graph

这是 nuget 包和 class 详细信息,如您在评论中所问:

  • Microsoft.Graph nuget 包 - 使用 Microsoft Graph API 并使用 GraphServiceClient class.

  • Microsoft.Azure.ActiveDirectory.GraphClient nuget 包 - 使用 Azure AD Graph API 并使用 ActiveDirectoryClient class。

Microsoft Graph API

API 的 - List directoryRoles and List members

var roles = await graphServiceClient.DirectoryRoles.Request().GetAsync();

var members = graphServiceClient.DirectoryRoles[role.Id].Members.Request().GetAsync();

Azure AD 图 API

API 的 - Get Directory Roles and Get a directory role's members

var directoryRoles =  activeDirectoryClient.DirectoryRoles.ExecuteAsync();

var members = await activeDirectoryClient.DirectoryRoles[role.ObjectId].Members.ExecuteAsync();

注意:在测试代码时,我还注意到 2 API 的行为略有不同。仅限 Microsoft Graph returns 用户,当您询问目录角色的成员时。另一方面,Azure AD Graph 返回了用户和服务主体。请参阅我的代码以了解 Azure AD Graph 的特殊检查。

另请注意,您获得的许多结果将是分页集合,因此您可能需要在多页结果的情况下处理分页。


Application Roles - 查找应用程序的所有应用程序角色,然后通过 App Role Assignments 查找用户数。

Application Roles 特定于在 Azure AD 中注册的应用程序。可以通过租户中该应用程序的服务主体来读取该应用程序的角色分配集合。

Azure AD 图 API

应用角色

var app = activeDirectoryClient.Applications["<applicationObjectId>"].ExecuteAsync().Result;
var appRoles = app.AppRoles;

应用角色分配

ActiveDirectoryClient activeDirectoryClient = new ActiveDirectoryClient(new Uri("https://graph.windows.net/<tenantGuid>"),
async () => await GetTokenForApplication());

var servicePrincipal = activeDirectoryClient.ServicePrincipals.Where(x => x.AppId == "<applicationId>").ExecuteAsync().Result.CurrentPage[0];
var appRoleAssignments = activeDirectoryClient.ServicePrincipals[servicePrincipal.ObjectId].AppRoleAssignedTo.ExecuteAsync().Result;
int userCountForApp = 0;
foreach(var appRoleAssignment in appRoleAssignments.CurrentPage)
{
    if (appRoleAssignment.PrincipalType == "User")
    {
        userCountForApp++;
        Console.WriteLine("Role Id = {0} and User Name = {1}", appRoleAssignment.Id, appRoleAssignment.PrincipalDisplayName);
    }
}

Microsoft Graph API

读取分配给用户的所有应用程序特定角色(即 AppRoleAssignments)的能力仅作为 Microsoft Graph API beta 端点的一部分提供。因此它不够稳定,无法在生产代码中使用,而且您找不到对 C# 的 Client SDK 支持。阅读

中的更多具体要点

以下是相关的 API: