Использование API REST Azure из функций Azure с проверкой подлинности Azure AD с использованием PowerShell - PullRequest
0 голосов
/ 04 июня 2018

Я пытаюсь вызвать API-интерфейс REST Azure из своих функций Azure с помощью PowerShell.Это нормально, когда я использую MSI с кодом ниже:

Write-Output "PowerShell Timer trigger function executed at:$(get-date)";
# Get an access token for the MSI
Write-Output "Endpoint: [$($env:MSI_ENDPOINT)]"
$apiVersion = "2017-09-01"
$resourceURI = "https://management.azure.com/"
$tokenAuthURI = $env:MSI_ENDPOINT + "?resource=$resourceURI&api-version=$apiVersion"
$tokenResponse = Invoke-RestMethod -Method Get -Headers @{"Secret" = "$env:MSI_SECRET"} -Uri $tokenAuthURI
$ArmToken = $tokenResponse.access_token

$uri = "https://management.azure.com/subscriptions?api-version=2016-06-01"
$params = @{
ContentType = 'application/json'
Headers = @{
'authorization'="Bearer $ARMToken"
}
Method = 'Get'
URI = $uri
}

$response = Invoke-RestMethod @params
$subscriptionId = $response.value.subscriptionId

# GET method: each querystring parameter is its own variable
if ($req_query_name) 
{
    $name = $req_query_name
}

$uri = "https://management.azure.com/subscriptions/" + $subscriptionId + "/resourcegroups?api-version=2018-02-01"

$params = @{
ContentType = 'application/json'
Headers = @{
'authorization'="Bearer $ARMToken"
}
Method = 'Get'
URI = $uri
}

$response = Invoke-RestMethod @params | ConvertTo-Json
Out-File -Encoding Ascii -FilePath $res -inputObject $response

Теперь моя цель будет состоять в том, чтобы аутентифицировать пользователей и использовать эту аутентификацию для вызова REST API, таким образом, только элементы моих пользователей будутполучено.

Я активировал аутентификацию для своих функций: Активировать аутентификацию

Аутентификация

Конфиг

Я заменяю свой код на это, чтобы отобразить переменные:

Write-Output "PowerShell Timer trigger function executed at:$(get-date)";

$Result = Get-Variable | ConvertTo-Json 

Затем я вызываю свои функции, при первом вызове мне предлагается разрешить ему «подключиться и просмотреть свой профиль»

Разрешить аутентификацию

В результате выполнения я получаю переменную "REQ_HEADERS_X-MS-TOKEN-AAD-ID-TOKEN" с токеном.

Token

Затем я пытаюсь повторно использовать этот токен для аутентификации моего вызова API REST:

Write-Output "PowerShell Timer trigger function executed at:$(get-date)"

$Result = Get-Variable -Name "REQ_HEADERS_X-MS-TOKEN-AAD-ID-TOKEN" | ConvertTo-Json | ConvertFrom-Json

$ARMToken =  $Result.Value

$uri = "https://management.azure.com/subscriptions?api-version=2016-06-01"
$params = @{
ContentType = 'application/json'
Headers = @{
'authorization'="Bearer $ARMToken"
}
Method = 'Get'
URI = $uri
}

$response = Invoke-RestMethod @params

Out-File -encoding Ascii -FilePath $res -inputObject $response

$response

Когда я вызываю свою функцию, я получаю это сообщение об ошибке:

2018-06-04T09:53:55.476 [Info] Function started (Id=a9e8c744-8f29-4516-95ad-7218b60790ec)
2018-06-04T09:53:56.711 [Info] PowerShell Timer trigger function executed at:06/04/2018 09:53:56
2018-06-04T09:53:57.499 [Error] Invoke-RestMethod : {"error":{"code":"InvalidAuthenticationTokenAudience","message":"The access token has been obtained from wrong audience or resource 'b46e2246-b8b5-4b33-897e-4702b6ddb868'. It should exactly match (including forward slash) with one of the allowed audiences 'https://management.core.windows.net/','https://management.azure.com/'."}}
at run.ps1: line 18
+ Invoke-RestMethod
+ _________________
+ CategoryInfo          : InvalidOperation: (System.Net.HttpWebRequest:HttpWebRequest) [Invoke-RestMethod], WebException
+ FullyQualifiedErrorId : WebCmdletWebResponseException,Microsoft.PowerShell.Commands.InvokeRestMethodCommand
2018-06-04T09:53:57.608 [Error] Exception while executing function: Functions.HttpTriggerPowerShell1. Microsoft.Azure.WebJobs.Script: PowerShell script error. Microsoft.PowerShell.Commands.Utility: The remote server returned an error: (401) Unauthorized.
2018-06-04T09:53:57.655 [Error] Function completed (Failure, Id=a9e8c744-8f29-4516-95ad-7218b60790ec, Duration=2167ms)

У кого-то есть идея, как повторно использовать токен для вызоваREST API с использованием аутентификации пользователя в функциях Azure?

...