#azure #powershell #authentication #active-directory
#azure #powershell #аутентификация #active-directory
Вопрос:
Я пытаюсь аутентифицировать веб-приложение Azure с помощью Azure Active directory. На данный момент я предпринял следующие шаги:
1- С помощью портала Azure я создал регистрацию приложения в AAD и назначил ее веб-приложению, следуя инструкциям здесь.
2- Я назначил некоторых пользователей своему приложению с помощью New-AzureADGroupAppRoleAssignment cmdlet
, а затем установил назначение пользователя в качестве требования, используя set-AzureADServicePrincipal -AppRoleAssignmentRequired $true
Это работает как ожидалось: пользователи, которым не назначен доступ к приложению, видят страницу «доступ запрещен», а те, кто назначен, видят страницу запроса «Согласие администратора».
Проблема в том, что в запросе согласия администратора нет ссылок, по которым они могли бы запросить это. Я пытался следовать инструкциям здесь, но у меня нет доступа к AAD через портал. Я могу сделать это только через Powershell.
Если вы знаете о командлете Powershell для установки этой ссылки (или для изменения согласия администратора на согласие пользователя), я был бы признателен, если бы вы могли опубликовать его здесь.
Ответ №1:
В настоящее время в PowerShell нет команды для предоставления согласия администратора, в вашем случае, если вы можете получить доступ к Azure AD с помощью powershell, я думаю, вы также можете получить к нему доступ через Azure CLI.
Итак, мой обходной путь заключается в использовании az ad app permission admin-consent
в Azure CLI, это эквивалент кнопки согласия администратора на портале.
Убедитесь, что у вас установлен Azure CLI, используйте az login
для входа учетную запись пользователя или участника службы, который является администратором в вашем клиенте AAD, затем выполните приведенную ниже команду.
az ad app permission admin-consent --id <application-id>
Ответ №2:
После попытки заставить это работать с участником службы, что, как оказалось, невозможно, поскольку это может быть выполнено только учетной записью пользователя az ad app permission admin-consent --id <application-id>
, стоимость будет снижена в будущей версии, как обсуждалось в этой теме вопроса:
https://github.com/Azure/azure-cli/issues/12137
Рекомендуемый способ предоставить согласие администратора API теперь:
az ad app permission grant --id 46eb4122-bd2b-4f54-af7b-6d79b46ee31a
--api 00000003-0000-0000-c000-000000000000
--scope "Directory.Read.All Directory.ReadWrite.All"
Документы Microsoft: предоставление разрешения приложению az ad
Ответ №3:
У вас есть два варианта. Согласие администратора может быть предоставлено, если у вас есть разрешение глобального администратора через портал или интерфейс командной строки AZ. Самый простой способ — через портал. Просто перейдите в AAD, регистрация приложений, затем найдите свое приложение. Перейдите в раздел разрешений. Вы должны увидеть кнопку согласия. Я не помню команду AZ cli сразу, но, вероятно, проще просто сделать это на портале.
Ответ №4:
К сожалению, это сложно. Не сопоставимо с «нажатием кнопки» на портале Azure.
Вот функция PowerShell, которая работает:
using namespace System.Collections.Generic
function Grant-AdminConsentToAllPermissions {
param(
[string]$AppDisplayName
)
$App = Get-MgApplication -Filter "DisplayName eq '$AppDisplayName'"
$sp = Get-MgServicePrincipal -Filter "AppId eq '$($App.AppId)'"
foreach ($resourceAccess in $App.RequiredResourceAccess) {
$resourceSp = Get-MgServicePrincipal -Filter "AppId eq '$($resourceAccess.ResourceAppId)'"
if (!$resourceSp) {
throw "Please cleanup permissions in the Azure portal for the app '$App.AppId', it contains permissions for removed App."
}
$scopesIdToValue = @{}
$resourceSp.PublishedPermissionScopes | % { $scopesIdToValue[$_.Id] = $_.Value }
[HashSet[string]]$requiredScopes = $resourceAccess.ResourceAccess | % { $scopesIdToValue[$_.Id] }
$grant = Get-MgOauth2PermissionGrant -Filter "ClientId eq '$($sp.Id)' and ResourceId eq '$($resourceSp.Id)'"
$newGrantRequired = $true
if ($grant) {
[HashSet[string]]$grantedScopes = $grant.Scope.Split(" ")
if (!$requiredScopes.IsSubsetOf($grantedScopes)) {
Write-Host "Revoking grant for '$($resourceSp.DisplayName)'"
Remove-MgOauth2PermissionGrant -OAuth2PermissionGrantId $grant.Id
}
else {
$newGrantRequired = $false
}
}
if ($newGrantRequired) {
$consentExpiry = ([datetime]::Now.AddYears(10))
$scopesToGrant = $requiredScopes -join " "
Write-Host "Issuing grant for '$($resourceSp.DisplayName)', scope = $scopesToGrant"
New-MgOauth2PermissionGrant -ClientId $sp.Id -ConsentType "AllPrincipals" `
-ResourceId $resourceSp.Id -Scope $scopesToGrant `
-ExpiryTime $consentExpiry | Out-Null
}
}
}
Ответ №5:
Эта функция PowerShell (вдохновленная https://f12.hu/2021/01/13/grant-admin-consent-to-an-azuread-application-via-powershell /) выполняет свою работу.
Параметр applicationId — это идентификатор объекта при регистрации приложения. Контекст взят из Get-AzContext.
function Set-AdminConsent {
[CmdletBinding()]
param (
[Parameter(Mandatory)]
[string]$applicationId,
# The Azure Context]
[Parameter(Mandatory)]
[object]$context
)
$token = [Microsoft.Azure.Commands.Common.Authentication.AzureSession]::Instance.AuthenticationFactory.Authenticate(
$context.Account, $context.Environment, $context.Tenant.Id, $null, "Never", $null, "74658136-14ec-4630-ad9b-26e160ff0fc6")
$headers = @{
'Authorization' = 'Bearer ' $token.AccessToken
'X-Requested-With' = 'XMLHttpRequest'
'x-ms-client-request-id' = [guid]::NewGuid()
'x-ms-correlation-id' = [guid]::NewGuid()
}
$url = "https://main.iam.ad.ext.azure.com/api/RegisteredApplications/$applicationId/Consent?onBehalfOfAll=true"
Invoke-RestMethod -Uri $url -Headers $headers -Method POST -ErrorAction Stop
}