c# - 使用 Graph Api 针对租户进行角色计数

标签 c# azure azure-active-directory microsoft-graph-api azure-ad-graph-api

有没有办法找到针对租户存在的每个角色以及针对每个分配的用户数量使用 GraphServiceClientGraphConnection 类的角色?我正在使用 C#。

最佳答案

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

我已经提供了 Microsoft Graph API ( https://graph.microsoft.com ) 以及 Azure AD Graph API ( https://graph.windows.net ) 的示例代码,但强烈建议使用较新的 Microsoft Graph API,除非您有特殊要求无法从中获取信息,只能查看 Azure AD Graph API。

在此处查看更详细的比较 Microsoft Graph or Azure AD Graph

以下是 nuget 包和类的详细信息,正如您在评论中所询问的:

  • Microsoft.Graph nuget 包 - 与 Microsoft Graph API 配合使用并使用 GraphServiceClient 类。

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

Microsoft Graph API

API - List directoryRolesList members

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

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

Azure AD 图形 API

API - Get Directory RolesGet a directory role's members

var directoryRoles =  activeDirectoryClient.DirectoryRoles.ExecuteAsync();

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

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

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


应用程序角色 - 查找应用程序的所有应用程序角色,然后通过应用程序角色分配查找用户数。

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 支持。阅读 this SO Post by Marc LaFleur 中的更多具体要点

以下是相关的 API:

关于c# - 使用 Graph Api 针对租户进行角色计数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55071897/

相关文章:

c# - 是否已知代码优先 EF 无法与包含大量 DbSet 的 DbContext 一起使用?

c# - 在 C# 中,将数组中的项合并为 "single larger item"的一部分的最优雅方法是什么?

c# - AutoFilterRow 上的 XtraGridView 自定义过滤器

c# - 使用 mvc 路由约束,因此 url 只能映射到三个可能的参数之一

.net - 如何让辅助角色应用程序访问Web角色实例中的文件

azure - 启用 Azure AD 身份验证后无法访问我的网站

azure - 如何使用 Bicep 创建资源组并向其中添加 key 保管库?

azure - pkgs.visualstudio.com 和 pkgs.dev.azure.com 之间有什么区别?

azure - 我怎样才能获得可以传递给azure rest api的不记名 token

azure-active-directory - 如何使用 Azure CLI 通过对象 ID 获取 Azure AD 对象