Как предоставить согласие администратора приложению Azure AAD в Powershell?

#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
}