Azure isMemberOf api给出"没有足够的权限来完成操作。"尝试从Azure虚拟机

时间:2018-05-17 14:15:11

标签: rest azure azure-active-directory azure-virtual-machine azure-ad-graph-api

所以我的要求是在Azure机器上运行的应用程序检查登录的特定Azure用户是否属于指定的Azure组。

我已为所述虚拟机启用了托管服务标识。 MSI

我通过使用以下命令调用VM上的图形资源来调用本地运行的元数据服务来获取VM的令牌:

curl 'http://169.254.169.254/metadata/identity/oauth2/token?api-version=2018-02-01&resource=https%3A%2F%2Fgraph.windows.net' -H Metadata:true

获得令牌后,我使用新获得的令牌向isMemberOf的图形API发出POST请求:

curl -i -H "Authorization: Bearer <token-value>" -H "Content-Type: application/json" --data '{"groupId":"xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx","memberId":"xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx"}' https://graph.windows.net/xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx/isMemberOf?api-version=1.6

我得到以下回复

{"odata.error":{"code":"Authorization_RequestDenied","message":{"lang":"en","value":"Insufficient privileges to complete the operation."}}}

我已将VM所属的资源组分配给IAM作为资源的所有者

我错过了我应该配置的东西,或者我在这里做错了什么?

2 个答案:

答案 0 :(得分:2)

所以我稍微挖了一下,发现微软更喜欢使用Microsoft Graph而不是Azure AD Graph的开发人员 Microsoft Graph vs Azure AD Graph

我在Microsoft Graph API中发现了一个类似的调用来获取信息成员User list member of call 此调用需要以下scope

Directory.Read.All
Directory.ReadWrite.All

这些是我遵循的步骤:

  1. 应用程序需要获取用于进行Microsoft图形API调用的令牌。
  2. POST https://login.microsoftonline.com/ {tenant-id} /oauth2/v2.0/token

    HEADER 内容类型:application / x-www-form-urlencoded

    BODY: CLIENT_ID =安培;范围= HTTPS%3A%2F%2Fgraph.microsoft.com%2F.default&安培; client_secret =安培; grant_type = client_credentials

    回应:

    {
        "token_type": "Bearer",
        "expires_in": 3600,
        "ext_expires_in": 0,
        "access_token": "<token-value>"
    }
    

    客户端密码是在应用注册时生成的。

    1. 应用程序将调用microsoft graph API来获取
    2. POST https://graph.microsoft.com/v1.0/users/ {user-object-id} / checkMemberGroups

      标题:授权:承载{token-value}             Content-Type:application / json

      BODY:

      {
          "groupIds":["xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx"]
      }
      

      响应:

      200 OK - 如果用户属于该组

      {
          "@odata.context": "https://graph.microsoft.com/v1.0/$metadata#Collection(Edm.String)",
          "value": [
              "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx"
          ]
      }
      

      404未找到 - 如果用户不存在

      {
          "error": {
              "code": "Request_ResourceNotFound",
              "message": "Resource 'xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx' does not exist or one of its queried reference-property objects are not present.",
              "innerError": {
                  "request-id": "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
                  "date": "2018-05-23T02:54:47"
              }
          }
      }
      

      这有助于应用程序识别Azure用户是否属于指定的组。

答案 1 :(得分:0)

您正在调用Azure AD Graph API,而不是ARM API。 IAM刀片仅提供ARM API的访问权限。

您需要手动为服务主体分配必要的权限。

我实际上在前一篇文章中写了一篇文章:Calling your APIs with Azure AD Managed Service Identity using application permissions

您将需要:

  1. 您的MSI服务主体对象ID(您可以在我的文章中看到如何找到它)
  2. 目标服务主体对象标识(在本例中为Azure AD Graph API)
  3. 您要分配的应用权限的ID(您可以使用例如https://graphexplorer.azurewebsites.net查找这些内容,它们位于服务主体的appRoles下)
  4. 获得这些后,您可以运行此PowerShell cmdlet(使用AAD v2 cmdlet):

    Connect-AzureAD
    New-AzureADServiceAppRoleAssignment -ObjectId msi-sp-id -Id app-permission-id -PrincipalId msi-sp-id -ResourceId aad-graph-sp-id
    

    然后一切都应该有效。