Недостаточно привилегий для завершения операции — сбой при создании PowerShell Azure Ad Apps

У меня есть Azure DevOps CI/CD, в котором есть сценарий PowerShell для создания нового приложения Azure Ad. Несмотря на то, что сервисному принципу предоставлены разрешения для следующих API-интерфейсов Graph, он не работает со следующим исключением.

2020-12-14T11:49:55.0146669Z ##[ошибка]Произошла ошибка при выполнении GetApplications Код: Authorization_RequestDenied Сообщение: Недостаточно привилегий для завершения операции. Ид запроса: 1130fbec-3eec-4c8e-a2dd-e134f2c4621f DateTimeStamp: Пн, 14 декабря 2020 г., 11:49:54 по Гринвичу HttpStatusCode: Запрещено HttpStatusDescription: Запрещено HttpResponseStatus: завершено

Разрешения API, которые у меня есть для Service Principle:

Я использую следующий сценарий для подключения к Azure AD из конвейера и создания приложения Azure Ad с помощью PowerShell.

Install-Module AzureAD -Force -Verbose -Scope CurrentUser
$context = [Microsoft.Azure.Commands.Common.Authentication.Abstractions.AzureRmProfileProvider]::Instance.Profile.DefaultContext
$graphToken = [Microsoft.Azure.Commands.Common.Authentication.AzureSession]::Instance.AuthenticationFactory.Authenticate($context.Account, $context.Environment, $context.Tenant.Id.ToString(), $null, [Microsoft.Azure.Commands.Common.Authentication.ShowDialog]::Never, $null, "https://graph.microsoft.com").AccessToken
$aadToken = [Microsoft.Azure.Commands.Common.Authentication.AzureSession]::Instance.AuthenticationFactory.Authenticate($context.Account, $context.Environment, $context.Tenant.Id.ToString(), $null, [Microsoft.Azure.Commands.Common.Authentication.ShowDialog]::Never, $null, "https://graph.windows.net").AccessToken

Connect-AzureAD -MsAccessToken $graphToken -AadAccessToken $aadToken -AccountId $context.Account.Id -TenantId $context.tenant.id

$ApiAppGuid = New-Guid
$ApiAppStartDate = Get-Date
$vvApiAppName = "dev0-vv-api"
# >>>>>> it must be failing here when trying to get the applications...
$appExists = ($vvApiApp = Get-AzureADApplication -Filter "DisplayName eq '$($vvApiAppName)'"  -ErrorAction SilentlyContinue)
#... rest of the code that call New-AzureADApplication 

Кроме того, когда я помещаю $graphToken в jwt.io, он правильно показывает разрешения API, которые я назначил Принципу службы на портале Azure.

Я понятия не имею, почему он продолжает терпеть неудачу, несмотря на предоставленные разрешения! Любые идеи высоко ценятся - теперь это занимает почти день.

Не могли бы вы попробовать Get-AzureADMSApplication вместо этого? Это немного глупо, но есть вероятность, что командлет использует API-интерфейс AAD Graph, и эти разрешения приложений там не работают :\

juunas 14.12.2020 13:37

что легко устранило проблему. очень признателен - массивная помощь! означает ли это также, что теперь я могу удалить все разрешения API из приложения? как будто он их не подхватывает?

Ali 14.12.2020 14:06

Я думаю, что Application.ReadWrite.OwnedBy будет достаточно из перечисленных вами разрешений. Или вы имеете в виду что-то другое?

juunas 14.12.2020 14:07

нет - собственно это я и имел в виду. Я попробую это только с Application.ReadWrite.OwnedBy, чтобы увидеть, все ли работает нормально.

Ali 14.12.2020 14:09

@Ali Обратите внимание, что AppRoleAssignment.ReadWrite.All — очень привилегированное разрешение. Рассмотрите возможность использования настраиваемой роли , которая включает разрешение на предоставление разрешений в соответствии с политикой согласия приложений, и используйте настраиваемую политику согласия, которая включает только те разрешения, которые действительно необходимы для вашего конвейера CI/CD. наградить.

Philippe Signoret 17.12.2020 14:47
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
5
737
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Как я и подозревал, Get-AzureADApplication использует Azure AD Graph API, и, скорее всего, данные разрешения приложения MS Graph API там не работают. Некоторые разрешения также работают в AAD Graph, но если это разрешение было создано позже, оно не будет поддерживаться.

Таким образом, решение состоит в том, чтобы вместо этого использовать Get-AzureADMSApplication, который использует API MS Graph. Большинство сценариев следует переключить на их использование любым способом, поскольку API AAD Graph устарел.

Другие вопросы по теме