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

даю приложение Azure AD с помощью модуля AzureAD для вызова Microsoft Graph API. Я могу успешно сгенерировать токен доступа. Но, когда я пытаюсь вызвать API, у меня появляется сообщение об ошибке: «Недопустимые утверждения / роли области действия».

Когда я нажимаю кнопку «Предоставить разрешения» в созданном приложении на портале Azure и повторяю вызов API, вызов работает.

Я нигде не нахожу, как сделать это "Предоставить разрешения" действия с Powershell. Есть ли способ сделать это ?

Спасибо

Damien

 Wayne Yang - MSFT17 нояб. 2017 г., 09:48
Этот случай может быть полезен для вас:stackoverflow.com/questions/43143075/...
 Damien Celle17 нояб. 2017 г., 16:02
Спасибо @ WayneYang-MSFT за быстрый ответ. Я уже добавил prompt = "admin_consent" в теле запроса аутентификации. Недостаточно «предоставить разрешения».
 Clijsters17 нояб. 2017 г., 09:48
 Wayne Yang - MSFT20 нояб. 2017 г., 02:50
Вы должны использовать&prompt=admin_consentНЕprompt="admin_consent", Кроме того, убедитесь, что учетная запись Azure, в которую вы вошли, является учетной записью администратора.
 Damien Celle05 янв. 2018 г., 17:25
Даже если я использую & prompt = admin_consent в REST URL, результат все тот же.

Ответы на вопрос(3)

для этого требуется, чтобы у вас были установлены модули AzureAD и AzureRM для Powershell и они не поддерживаются Microsoft.

Оригинальный пост / ссылка на мой блог находится здесь:http://www.lieben.nu/liebensraum/2018/04/how-to-grant-oauth2-permissions-to-an-azure-ad-application-using-powershell-unattended-silently/

Пример конкретного кода, который должен помочь вам достичь этого:

Function Grant-OAuth2PermissionsToApp{
Param(
    [Parameter(Mandatory=$true)]$Username, #global administrator username
    [Parameter(Mandatory=$true)]$Password, #global administrator password
    [Parameter(Mandatory=$true)]$azureAppId #application ID of the azure application you wish to admin-consent to
)

$secpasswd = ConvertTo-SecureString $Password -AsPlainText -Force
$mycreds = New-Object System.Management.Automation.PSCredential ($Username, $secpasswd)
$res = login-azurermaccount -Credential $mycreds
$context = Get-AzureRmContext
$tenantId = $context.Tenant.Id
$refreshToken = @($context.TokenCache.ReadItems() | where {$_.tenantId -eq $tenantId -and $_.ExpiresOn -gt (Get-Date)})[0].RefreshToken
$body = "grant_type=refresh_token&refresh_token=$($refreshToken)&resource=74658136-14ec-4630-ad9b-26e160ff0fc6"
$apiToken = Invoke-RestMethod "https://login.windows.net/$tenantId/oauth2/token" -Method POST -Body $body -ContentType 'application/x-www-form-urlencoded'
$header = @{
'Authorization' = 'Bearer ' + $apiToken.access_token
'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/$azureAppId/Consent?onBehalfOfAll=true"
Invoke-RestMethod -Uri $url -Headers $header -Method POST -ErrorAction Stop
}
 Jos10 апр. 2018 г., 16:27
хмм @ MuhammadRehanSaeed вы пробовали запустить login-azurermaccount раньше на машине? Других ошибок нет? Это может быть разницей между нами обоими, будь то разрешения или разрешения вашей учетной записи (у меня есть глобальный администратор)
 Muhammad Rehan Saeed10 апр. 2018 г., 12:19
Я получаю ошибку:Invoke-RestMethod : {"error":"invalid_grant","error_description":"AADSTS70000: Transmission data parser failure: Refresh Token is malformed or invalid.
 Muhammad Rehan Saeed10 апр. 2018 г., 16:46
@Jos Вход выполнен успешно, и я являюсь глобальным администратором Azure в нашей тестовой среде, где я пробовал это сделать.
 Jos11 апр. 2018 г., 09:13
@MuhammadRehanSaeed Я попробовал это в другом клиенте, получил другую ошибку от вас, затем добавил заголовки guid согласно обновленному коду выше, и это сработало
 Oleg Skripnyak10 апр. 2018 г., 14:13
@MuhammadRehanSaeed То же самое здесь

то он использует «Согласие администратора». В этом случае вы должны использовать&prompt=admin_consent в запросе авторизации напрямую.

Если ваше приложение запрашивает разрешение только для приложения и пользователь пытается войти в приложение, отображается сообщение об ошибке, в котором говорится, что пользователь не может дать согласие.

Требуется ли разрешение для администратора или нет, определяется разработчиком, опубликовавшим ресурс, и его можно найти в документации к ресурсу.

Ссылка:Мультитенантный шаблон приложения

Список доступных разрешений для API-интерфейса Azure AD Graph и API-интерфейса Microsoft Graph

Графики API разрешений

Согласие

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

Я наткнулся на ту же ошибку'Refresh token is malformed', При считывании маркера обновления токен был дважды в строке. Решил это, добавив строку

$refreshtoken = $refreshtoken.Split("`n")[0]

Ваш ответ на вопрос