Как использовать доступ к Azure AD Graph API для субъектов-служб?

У меня есть работающее приложение демона Azure AD / Azure, использующее adal4j, которое использует аутентификацию пользователя / пароля. Из-за проблем с ADFS я также хочу иметь возможность аутентифицироваться с использованием принципала службы (идентификатор / секрет клиента). Кажется, это нормально работает для части приложения Azure (не AD), поскольку роли SP могут быть определены для рассматриваемых подписок, однако для части Azure AD я получаю:

response code 403, error: Authorization_RequestDenied: Insufficient privileges to complete the operation.

... это происходит при первом вызове Graph API - я получаю действительные токены из AuthenticationContext.acquireToken (), используя https://graph.windows.net.

Моя учетная запись является владельцем каталога. Я пробовал использовать кнопку «Предоставить разрешения» в приложении, а также попытался сфабриковать URL-адрес согласия (который работает) и использовать его, чтобы разрешить приложению необходимые привилегии в каталоге. Ни то, ни другое, похоже, на это не влияет.

Это собственное приложение, так как это приложение-демон / служба, поэтому оно не может участвовать в согласии OAuth2.

Как получить доступ к API Graph Azure AD с помощью SP для аутентификации? Напоминаем, что без изменений приложение работает с пользователем / паролем (не ADFS), а SP работает с API Azure, а не с API Graph Azure AD.

Спасибо...

P.S. Я также пробовал это с помощью Azure Graph API, который Microsoft теперь рекомендует вместо Azure AD Graph API. Тот же результат и аналогично работает с кредитами пользователя / пароля.

Внесение поправок в это, чтобы убрать adal4j с поля зрения - это скорее общая проблема Azure AD. Вот пример проблемы с использованием curl:

Запрос токена учетных данных клиента:

curl --request POST "https://login.windows.net/367cxxxx41e5/oauth2/token" --data-urlencode "resource=https://graph.windows.net" --data-urlencode "client_id=9d83yyyy08cd" --data-urlencode "grant_type=client_credentials" --data-urlencode "client_secret=secret"

Ответ токена учетных данных клиента:

{"token_type":"Bearer","expires_in":"3599","ext_expires_in":"0","expires_on":"1491486990","not_before":"1491483090","resource":"https://graph.windows.net","access_token":"eyJ0zzzz2zVA"}

Запрос REST Azure AD с использованием токена учетных данных клиента:

curl "https://graph.windows.net/367cxxxx41e5/tenantDetails" --header "Authorization: eyJ0xxxx2zVA" --header "Accept: application/json;odata=minimalmetadata" --header "api-version: 1.6"

Ответ REST Azure AD с использованием токена учетных данных клиента:

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

Теперь сравните это с (обратите внимание на тот же идентификатор клиента / идентификатор приложения):

Запрос токена учетных данных пароля:

curl --request POST "https://login.windows.net/367cxxxx41e5/oauth2/token" --data-urlencode "resource=https://graph.windows.net" --data-urlencode "client_id=9d83yyyy08cd" --data-urlencode "grant_type=password" --data-urlencode "[email protected]" --data-urlencode "password=password"

Ответ токена учетных данных пароля:

{"token_type":"Bearer","scope":"Directory.AccessAsUser.All Directory.Read.All Group.Read.All Member.Read.Hidden User.Read User.Read.All User.ReadBasic.All","expires_in":"3599","ext_expires_in":"0","expires_on":"1491489157","not_before":"1491485257","resource":"https://graph.windows.net","access_token":"eyJ0zzzz0EXQ","refresh_token":"AQABzzzzAgAA"}

Запрос REST Azure AD с использованием токена учетных данных пароля:

curl "https://graph.windows.net/367cxxxx41e5/tenantDetails" --header "Authorization: eyJ0xxxx0EXQ" --header "Accept: application/json;odata=minimalmetadata" --header "api-version: 1.6"

Ответ REST Azure AD с использованием токена учетных данных пароля:

{"odata.metadata":"https://graph.windows.net/367cxxxx41e5/$metadata#directoryObjects/Microsoft.DirectoryServices.TenantDetail","value":[{"odata.type":"Microsoft.DirectoryServices.TenantDetail","objectType":"Company","objectId":"367cxxxx41e5","deletionTimestamp":null,"assignedPlans":[{"assignedTimestamp":"2017-02-24T03:25:33Z","capabilityStatus":"Enabled","service":"SharePoint","servicePlanId":"e95byyyyc014"},...

На данный момент я подозреваю, что SP, созданный по умолчанию Azure AD при создании приложения, не включает необходимые разрешения. Попробую создать новый ИП с указанными правами. Примеров этого предостаточно, но все они сосредоточены на том, что целевое приложение является мифическим бизнес-приложением, а не Azure AD. И, как это обычно бывает с недоработанным порталом, для этого необходимо использовать интерфейс командной строки.

</snark>

Кроме того, я убедился, что любой человек с ролью Читателя должен иметь возможность выполнить этот запрос. Я добавил и Contributer, и Owner в SP, но безрезультатно.

Также, FWIW, я подтвердил, что SP теоретически имеет разрешения Azure AD (и другие), которые я ввел на портале. Думаю.

    PS C:\> Get-AzureADServicePrincipalOAuth2PermissionGrant -objectid 'a9f9xxxx5377'|format-list -property consenttype,resourceid,scope

ConsentType : AllPrincipals
ResourceId  : c569xxxxe7f0
Scope       : Member.Read.Hidden User.Read User.ReadBasic.All User.Read.All Group.Read.All Directory.Read.All
              Directory.AccessAsUser.All

ConsentType : AllPrincipals
ResourceId  : 3318xxxx66a5
Scope       : user_impersonation

ConsentType : AllPrincipals
ResourceId  : 8c0fxxxx4198
Scope       : User.Read.All User.ReadBasic.All Group.Read.All Directory.Read.All Directory.AccessAsUser.All User.Read

PS C:\> get-azureadobjectbyobjectid -objectids 'c569xxxxe7f0','3318xxxx66a5','8c0fxxxx4198'

 ObjectId     AppId                                DisplayName
--------     -----                                -----------
8c0fxxxx4198 00000003-0000-0000-c000-000000000000 Microsoft Graph
3318xxxx66a5 797f4846-ba00-4fd7-ba43-dac1f8f63013 Windows Azure Service Management API
c569xxxxe7f0 00000002-0000-0000-c000-000000000000 Microsoft.Azure.ActiveDirectory

person MushyMiddle    schedule 04.04.2017    source источник
comment
Привет, вы пробовали использовать новую регистрацию приложений (предварительная версия) на портале. В нем перечислены SP, которые у вас уже есть, и вы можете добавить разрешения Microsoft Graph API, но вы должны быть администратором, чтобы дать согласие на это - попробуйте выполнить шаги здесь - docs.microsoft.com/en-us/graph/auth-v2-service   -  person Agraj    schedule 08.03.2019


Ответы (1)


Согласно вашему описанию, по моему опыту, я думаю, что проблема была вызвана двумя причинами.

  1. Не добавляйте доступ api для Windows Azure Active Directory (Microsoft.Azure.ActiveDirectory) на вкладке Required permissions вашего зарегистрированного приложения в Azure AD на портале Azure, как показано ниже, и выберите соответствующие разрешения.

введите здесь описание изображения

В качестве ссылок вы можете обратиться к другому потоку SO Проблема с авторизацией с помощью client_credentials Azure AD Graph API или официального документа здесь и полезный блог.

  1. Не назначать Contributor этому субъекту службы. Для этого вам нужно запустить приведенную ниже команду powershell.

    New-AzureRmRoleAssignment -RoleDefinitionName Contributor -ServicePrincipalName 'applicationID'
    

    Или вы также можете обратиться к моему ответу для другого потока SO Невозможно перечислить издателей изображений из Azure java SDK, чтобы сделать это через Azure CLI или просто на портале Azure.

Надеюсь, это поможет.

person Peter Pan    schedule 06.04.2017
comment
Питер Пэн: Спасибо за ответ. Пожалуйста, посмотрите мой расширенный пост, в котором есть примеры добра / зла. Как я уже упоминал, я не думаю, что проблема заключается в правах, перечисленных на портале, а скорее в правах, назначенных SP (к сожалению, недоступных на портале). Они у меня были с самого начала. Я подозреваю, что вторая часть вашего ответа попадает в цель. - person MushyMiddle; 06.04.2017
comment
Питер Пэн: Извини - без радости. Я попытался добавить роли Contributer и Owner (по отдельности), но все равно получаю ту же ошибку. RoleAssignmentId: /subscriptions/ff34xxxx65df/providers/Microsoft.Authorization/roleAssignments/0c7exxxxaa2b Область: / subscriptions / ff34xxxx65df DisplayName: Тестовый идентификатор клиента Azure AD SignInName: RoleDefinitionName: Owner RoleDefinitionName: Owner RoleDefinitionIxxd: - person MushyMiddle; 06.04.2017
comment
Питер Пэн: Меня действительно интересует объем роли SP. При использовании New-AzureRmRoleAssignment областью должна быть подписка. Поскольку каталог на самом деле не связан с подпиской, как определить, какую область использовать? Если вы посмотрите на правильный ответ токена пользователя, он включает в себя области, определенные для приложения. Эти области отклоняются, когда я пытаюсь их добавить. Мой опыт работы с подписками Azure AD показывает, что их нельзя использовать для назначения ролей напрямую. По крайней мере, Azure CLI (а не PowerShell) отклоняет эти подписки при попытке выполнить действия RBAC. - person MushyMiddle; 06.04.2017