使用Graph API/SDK/门户获取服务主体应用角色分配时的不一致行为
解决Azure AD服务主体应用角色分配查询的不一致问题
问题原因
这是Microsoft Graph API v1.0的默认行为差异,两个接口对appRoleAssignedTo的返回逻辑做了不同的默认过滤:
GET /servicePrincipals/{id}/appRoleAssignedTo(列表接口):默认仅返回用户和服务主体的应用角色分配,自动过滤了组的分配,这和Azure Portal中SP的“用户和组”页面默认只显示用户的逻辑一致。GET /servicePrincipals/{id}?$expand=appRoleAssignedTo(带展开的详情接口):默认仅返回组的应用角色分配,自动过滤了用户的分配。
正确获取所有应用角色分配的方案
方案1:显式过滤主体类型(推荐)
直接在列表接口中添加$filter参数,强制返回用户和组的所有分配记录:
HTTP 请求示例
GET https://graph.microsoft.com/v1.0/servicePrincipals/<service-principal-id>/appRoleAssignedTo?$filter=principalType eq 'User' or principalType eq 'Group'
.NET SDK 代码示例
var authProvider = new TokenCredentialAuthProvider(new DefaultAzureCredential()); var graphServiceClient = new GraphServiceClient("https://graph.microsoft.com/v1.0", authProvider); var request = graphServiceClient.ServicePrincipals["my-service-principal-id"] .AppRoleAssignedTo .Request() .Filter("principalType eq 'User' or principalType eq 'Group'"); var response = await request.GetAsync(); // 包含用户和组的所有应用角色分配
方案2:合并两个接口的结果
如果无法使用过滤参数,可分别调用两个接口再合并结果集(注意去重,避免重复记录):
- 调用列表接口获取用户/服务主体的分配
- 调用带展开的详情接口获取组的分配
- 将两个结果合并为完整列表
补充说明
Azure Portal中SP的“用户和组”页面默认只显示用户,若要查看组的分配,可在页面内使用筛选器选择“组”类型,或切换到对应视图。
内容的提问来源于stack exchange,提问作者Gaurav Mantri
相关产品推荐
相关产品推荐

