如何使用 Azure Active Directory Graph API 获取属于 AppRole 的所有用户

How to get all users that belong in an AppRole using Azure Active Directory Graph API

我这辈子都想不出如何查询 Azure Active Directory 的图表 API 来获取属于特定 AppRole 的所有用户。

首先我尝试了类似的方法:

client.Users.Where(u => u.AppRoleAssignments.Any(r => r.Id == "some-guid"));

但这不会编译,因为 AppRoleAssignments 是一个 IPagedCollection,因此您不能在其上执行 .Any 之类的操作。

然后我尝试为我的应用程序查询 ServicePrincipal 中的所有 AppRoleAssignments:

var servicePrincipal = await client.ServicePrincipals
    .Expand(p => p.AppRoleAssignments)
    .Where(p => p.AppId == "my app id guid")
    .ExecuteSingleAsync();

但是servicePrincipal.AppRoleAssignments固执地空着回来似乎无视我的.Expand.

我也试过直接通过 ID 获取 ServicePrincipal 并进行 Expand:

var principal = await client.ServicePrincipals
    .GetByObjectId("feeaae9c-40a3-48a3-8a01-b87343f5ecfc")
    .Expand(p => p.AppRoleAssignments)
    .ExecuteAsync();

但这只会导致错误(如果删除 .Expand 就会消失):

{"odata.error":{"code":"Request_BadRequest","message":{"lang":"en","value":"Invalid object identifier 'feeaae9c-40a3-48a3-8a01-b87343f5ecfc()'."}}}

这是一个奇怪的错误,因为错误消息中的对象 ID 带有我的代码未添加的“()”后缀。

我是不是遗漏了什么明显的东西?肯定有一种简单的方法可以让所有用户加入一个 AppRole 吗?

我终于找到了答案。为了从 ServicePrincipal 获取 AppRoleAssignments,您需要直接查询列表而不是尝试将其从 ServicePrincipal 扩展:

await client.ServicePrincipals
    .GetByObjectId(servicePrincipalObjectId)
    .AppRoleAssignedTo
    .ExecuteAsync()

然后您必须手动遍历用户和组以获得最终的用户列表。这可能会导致许多 Graph API 服务调用,具体取决于有多少组和用户,因此请注意!

编辑: 正如 Dan Kershaw 在评论中提到的那样,角色仅适用于直接链接到 AppRoles 的组中的用户。子组不继承角色。

我已经在 Gist 中提出了完整的解决方案 here 因为它实在是太大了,无法在这里进行内联。