У меня есть 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.
Я понятия не имею, почему он продолжает терпеть неудачу, несмотря на предоставленные разрешения! Любые идеи высоко ценятся - теперь это занимает почти день.
что легко устранило проблему. очень признателен - массивная помощь! означает ли это также, что теперь я могу удалить все разрешения API из приложения? как будто он их не подхватывает?
Я думаю, что Application.ReadWrite.OwnedBy будет достаточно из перечисленных вами разрешений. Или вы имеете в виду что-то другое?
нет - собственно это я и имел в виду. Я попробую это только с Application.ReadWrite.OwnedBy
, чтобы увидеть, все ли работает нормально.
@Ali Обратите внимание, что AppRoleAssignment.ReadWrite.All
— очень привилегированное разрешение. Рассмотрите возможность использования настраиваемой роли , которая включает разрешение на предоставление разрешений в соответствии с политикой согласия приложений, и используйте настраиваемую политику согласия, которая включает только те разрешения, которые действительно необходимы для вашего конвейера CI/CD. наградить.
Как я и подозревал, Get-AzureADApplication
использует Azure AD Graph API, и, скорее всего, данные разрешения приложения MS Graph API там не работают.
Некоторые разрешения также работают в AAD Graph, но если это разрешение было создано позже, оно не будет поддерживаться.
Таким образом, решение состоит в том, чтобы вместо этого использовать Get-AzureADMSApplication
, который использует API MS Graph.
Большинство сценариев следует переключить на их использование любым способом, поскольку API AAD Graph устарел.
Не могли бы вы попробовать
Get-AzureADMSApplication
вместо этого? Это немного глупо, но есть вероятность, что командлет использует API-интерфейс AAD Graph, и эти разрешения приложений там не работают :\