我无法终身了解如何查询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并进行扩展:
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吗?
答案 0 :(得分:3)
我终于找到了答案。为了从ServicePrincipal获取AppRoleAssignments,您需要直接查询列表,而不是尝试将其从ServicePrincipal扩展:
await client.ServicePrincipals
.GetByObjectId(servicePrincipalObjectId)
.AppRoleAssignedTo
.ExecuteAsync()
然后,您必须手动浏览用户和组以获取最终用户列表。这可能会导致许多Graph API服务调用,具体取决于有多少组和用户,因此请注意!
编辑:正如Dan Kershaw在评论中提到的,角色仅适用于与AppRoles直接关联的群组中的用户。子组不继承角色。
我已经在Gist here中提出了完整的解决方案,因为它太大了,无法在此处插入内容。