Azure Graph 403 Authorization_RequestDenied 使用来自 VSTS 的服务主体

Azure Graph 403 Authorization_RequestDenied using service principal from VSTS

我有一个服务主体,VSTS 使用它来 运行 Azure Powershell 脚本。我要调用的命令是 Get-AzureRmRoleAssignment。我收到以下错误消息

  "Exception": {
     "Request": {
       "Method": "POST",
       "RequestUri": "https://graph.windows.net/********/getObjectsByObjectIds?api-version=1.6",
       "Properties": "System.Collections.Generic.Dictionary`2[System.String,System.Object]",
       "Headers": "System.Collections.Generic.Dictionary`2[System.String,System.Collections.Generic.IEnumerable`1[System.String]]"
     },
     "Response": {
       "StatusCode": 403,
       "ReasonPhrase": "Forbidden",
       "Content": {
         "odata.error": {
           "code": "Authorization_RequestDenied",
           "message": {
             "lang": "en",
             "value": "Insufficient privileges to complete the operation."
           }
         }
       },
       "Headers": "System.Collections.Generic.Dictionary`2[System.String,System.Collections.Generic.IEnumerable`1[System.String]]"
}
}

我已验证服务主体具有角色分配的读取权限。

实际上,此 powershell 脚本 Get-AzureRmRoleAssignment 不仅需要 读取访问权限以使用 Azure REST API 权限 进行角色分配,还需要 使用 Azure AD Graph 读取目录数据权限 API.

我们可以用Fiddler找出这个命令调用了哪个API:

表示Get-AzureRmRoleAssignment需要调用3APIs来完成操作。其中两个是 Azure REST API,其中一个是 Azure AD Graph API:

POST https://graph.windows.net/<tenantID>/getObjectsByObjectIds?api-version=1.6

解法:

所以,检查你的sp是否有读取目录数据的权限。(你最好在Application权限和Delegated权限都添加Read directory data权限,然后点击Grant permissions按钮).这是我的测试结果:

希望对您有所帮助!