Azure isMemberOf api предоставляет «Недостаточно прав для завершения операции».ошибка при попытке доступа из виртуальной машины Azure - PullRequest
0 голосов
/ 17 мая 2018

Поэтому мое требование заключается в том, чтобы приложение, работающее на компьютере Azure, проверяло, принадлежит ли определенный пользователь Azure, вошедший в систему, к назначенной группе Azure.

Я включил идентификацию управляемого сервиса для указанной виртуальной машины. MSI

Я получаю токен для виртуальной машины, вызывая службу метаданных, работающую локально, с помощью следующей команды для ресурса графика на виртуальной машине:

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

Как только я получаю токен, я делаю POST-запрос к API графа isMemberOf с этим вновь полученным токеном:

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."}}}

Я назначил группу ресурсов, к которой принадлежит виртуальная машина, с IAM в качестве владельца ресурса

Я что-то упускаю, что мне нужно настроить, или я здесь что-то не так делаю?

Ответы [ 2 ]

0 голосов
/ 23 мая 2018

Поэтому я немного покопался и обнаружил, что Microsoft предпочитает нас, разработчиков, использующих Microsoft Graph, а не Azure AD Graph. График Microsoft против Azure AD Graph

Я нашел аналогичный вызов в Microsoft Graph API для получения информации о члене Список пользователей участника вызова Для этого вызова требуется следующая scope :

Directory.Read.All
Directory.ReadWrite.All

И вот шаги, которым я следовал:

  1. Приложению потребуется получить токен для выполнения вызова API Microsoft Graph.

POST https://login.microsoftonline.com/{tenant-id}/oauth2/v2.0/token

HEADER Тип содержимого: application / x-www-form-urlencoded

Корпус: client_id = & сфера = HTTPS% 3A% 2F% 2Fgraph.microsoft.com% 2F.default & client_secret = & grant_type = client_credentials * +1023 *

ОТВЕТ:

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

Секрет клиента генерируется при регистрации приложения.

  1. Приложение будет вызывать API-интерфейс Microsoft Graph для получения

POST https://graph.microsoft.com/v1.0/users/{user-object-id}/checkMemberGroups

HEADERS: авторизация: Bearer {token-value} Тип контента: приложение / JSON

ТЕЛО:

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

РЕПЛИКА:

200 ОК - если пользователь принадлежит к группе

{
    "@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 к назначенной группе или нет.

0 голосов
/ 17 мая 2018

Вы вызываете API графа AD Azure, а не API ARM.Блейд IAM предоставляет только права доступа для API ARM.

Вам нужно будет вручную назначить необходимые права для принципала службы.

Я действительно написал статью об этом некоторое время назад: Вызов API-интерфейсов с использованием идентификатора управляемой службы Azure AD с использованием разрешений приложения .

Вам потребуется:

  1. Ваш идентификатор объекта субъекта службы MSI (вы можете увидеть, какчтобы найти это в моей статье)
  2. Идентификатор объекта субъекта основной службы (в данном случае Azure AD Graph API)
  3. Идентификатор разрешения приложения, которое вы хотите назначить (вы можете использовать, например, https://graphexplorer.azurewebsites.net чтобы найти их, они находятся под appRoles на субъекте службы)

После того, как они у вас есть, вы можете запустить этот командлет PowerShell (используя командлеты AAD v2):

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

Тогда все должно работать.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...