REST API хранилища возвращает удаленное имя, которое часто не может быть разрешено

Я вызываю REST API хранилища, чтобы получить имена контейнеров, используя

Invoke-WebRequest -Method GET -Uri $storage_url -Headers $headers

Эта команда часто возвращает сообщение «ошибка удаленного имени не может быть разрешена», даже если учетная запись хранения существует и доступна. Простой повторный запуск команды дает правильный результат.

Invoke-WebRequest : The remote name could not be resolved: '<storageAccountName>.blob.core.windows.net'
At line:1 char:1
+ Invoke-WebRequest -Method GET -Uri $storage_url -Headers $headers #In ...
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : InvalidOperation: (System.Net.HttpWebRequest:HttpWebRequest) [Invoke-WebRequest], WebException
    + FullyQualifiedErrorId : WebCmdletWebResponseException,Microsoft.PowerShell.Commands.InvokeWebRequestCommand

person user2848940    schedule 23.06.2020    source источник
comment
как вы думаете, почему это как-то связано с Azure?   -  person 4c74356b41    schedule 23.06.2020
comment
Какой api вы использовали? Какой способ авторизации вы использовали? Не могли бы вы включить более подробную информацию о запросе? Включить URL-адрес запроса и заголовки?   -  person Joy Wang    schedule 24.06.2020
comment
Используемая версия API - 09.11.2017; URL- https: // ‹storageAccountName› .blob.core.windows.net /? Comp = list; Маркер-носитель аутентификации AAD с использованием URL-адреса login.microsoftonline.com/?tenantId›/oauth2/token и body- client_id: ‹clientId› client_secret: ‹секрет клиентского приложения› ресурс: https: // ‹storageAccountName› .blob.core.windows .net grant_type: client_credentials; и заголовки - x-ms-date, x-ms-version и Authorization = 'Bearer ‹bearer token›'   -  person user2848940    schedule 24.06.2020


Ответы (1)


На основе предоставленной вами информации вы используете поток учетных данных клиента для получения токена доступа, а затем используете токен для вызова _ 1_.

Вы можете использовать приведенный ниже сценарий, у меня он работает.

Убедитесь, что у используемого субъекта-службы есть роль RBAC, например Contributor/Owner в вашей учетной записи хранения - ›Access Control, если нет, нажмите Add, чтобы добавить его.

введите описание изображения здесь

$ClientID       = "xxxxxxx" 
$ClientSecret   = "xxxxxxx"  
$tennantid      = "xxxxxxx"
$storageaccountname = "joystoragev2"

$TokenEndpoint = {https://login.microsoftonline.com/{0}/oauth2/token} -f $tennantid 
$Resource = "https://storage.azure.com/"

$Body = @{
        'resource'= $Resource
        'client_id' = $ClientID
        'grant_type' = 'client_credentials'
        'client_secret' = $ClientSecret
}

$params = @{
    ContentType = 'application/x-www-form-urlencoded'
    Headers = @{'accept'='application/json'}
    Body = $Body
    Method = 'Post'
    URI = $TokenEndpoint
}

$token = Invoke-RestMethod @params

$accesstoken = $token.access_token

$url = {https://{0}.blob.core.windows.net/?comp=list} -f $storageaccountname

$header = @{
    'Authorization' = 'Bearer ' + $accesstoken
    'x-ms-version' = '2019-02-02'
}

$response = Invoke-WebRequest –Uri $url –Headers $header –Method GET

$response.RawContent

введите описание изображения здесь

person Joy Wang    schedule 24.06.2020
comment
Большое спасибо, радость :) Я использую тот же сценарий с двумя отличиями: 1. добавил клиентское приложение как «Storage Blob Data Reader» вместо Owner в учетную запись хранилища, чтобы оно получало доступ только для чтения blob, а не для записи + использовал ресурс как https: // ‹storageAccountName› .blob.core.windows.net 'вместо storage.azure .com 'снова для ограниченного доступа ... но позвольте мне попробовать с версией, которую вы использовали -' 2019-02-02 ', поскольку я использовал' 2017-11-09 '... возможно, проблема будет исправлена ​​позже версии - person user2848940; 24.06.2020
comment
@ user2848940 Также убедитесь, что вы отключили брандмауэр учетной записи хранения. - person Joy Wang; 24.06.2020
comment
брандмауэр yeap отключен, и этот API работает лучше .. Я буду использовать последнюю версию API 2019-07-07 - person user2848940; 24.06.2020