Добавьте значение с помощью специальных символов в хранилище ключей

В настоящее время в конвейере выполняется сценарий Powershell для сохранения URL-адреса рабочего процесса стандартного приложения логики в хранилище ключей Azure. Возникают следующие проблемы: Мой скрипт сначала вызывает en, сохраняет результат в переменной, назовем ее $result, используя: az rest --method post --uri XXXX

(https://medium.com/@mail4ankitg/get-workflow-trigger-callback-url-in-azure-logic-app-standard-using-powershell-and-azure-cli-5cc7bf983131)

Я получаю URL-адрес, сохраняя его в следующей переменной:

$urlResult = ($result | ConvertFrom-Json).value

URL-адрес обычно выглядит примерно так:

https://X.appserviceenvironment.net:443/api/NameWorkFlow/triggers/When_a_HTTP_request_is_received/invoke?api-version=2022-05-01&sp=%2Ftriggers%2FWhen_a_HTTP_request_is_received%2Frun&sv=1.0&sig=SIGVALUE

Теперь, когда я пытаюсь добавить этот URL-адрес рабочего процесса в хранилище ключей:

az keyvault secret set --vault-name $keyVaultName --name "Name" --value $urlResult

Мой скрипт завершается с кодом ошибки:

Я попытался избежать urlResult, используя:

$escapedUrl = [System.Uri]::EscapeDataString($urlResult)

На этот раз сценарий запускается, но в хранилище ключей добавляется следующее значение:

https%3A%2F%2FX.appserviceenvironment.net%3A443%2Fapi%2FNameWorkFlow%2Ftriggers%2FWhen_a_HTTP_request_is_received%2Finvoke%3Fapi-version%3D2022-05-01%26sp%3D%252Ftriggers%252FWhen_a_HTTP_request_is_receive d%252Frun%26sv%3D1.0% 26сиг%3DSIGVALUE

Наконец, я также попробовал использовать '' вокруг значения, например:

az keyvault secret set --vault-name $keyVaultName --name "Name" --value '$urlResult'

Но это, конечно, только добавляет «$urlResult» в хранилище ключей.

Вариантов сейчас нет, может кто-нибудь помочь?

Упоминалось в посте выше. Пробовал 2 подхода, но оба не привели к желаемому результату.

Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
1
0
174
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

Ответ принят как подходящий

Работа со специальными символами может быть сложной.

Попробуйте вывести значение в текстовый файл, а затем создать секрет, используя параметр --file вместо --value.

Что-то вроде этого (не проверялось):

$secretFile = "$(Agent.TempDirectory)/secret.txt"

# other commands here

($result | ConvertFrom-Json).value | Out-File $secretFile -NoNewline

az keyvault secret set --vault-name $keyVaultName --name "Name" --file $secretFile --output none

# files in $(Agent.TempDirectory) are automatically deleted after the pipeline finishes,
# but better be safe than sorry
Remove-Item $secretFile -Force

РЕДАКТИРОВАТЬ 1

При создании текстового файла может потребоваться указать кодировку - например. utf8 или utf8NoBOM:

($result | ConvertFrom-Json).value | Out-File $secretFile -NoNewline -Encoding utf8NoBOM

И/или установка секрета:

az keyvault secret set --vault-name $keyVaultName --name "Name" --file $secretFile --encoding utf-8 --output none

Эй, спасибо за комментарий. Я последовал вашему совету, и мне пришлось внести следующие изменения, поскольку Agent.TempDirectory выдал нераспознанную ошибку в конвейере. Я использую: $secretFile = [System.IO.Path]::Combine($env:AGENT_TEMPDIRECTORY, "secret.txt") и добавляю secretFile как файл в хранилище ключей. Однако, когда мы пытаемся получить значение, мы получаем следующее: ÿþh\u0000t\u0000t\u0000p\u0000s\u0000:\u0000/\u0000/\u0000l\‌​u0000a\u0000p\u0000-‌​\u0000t\u0000- \u0000‌​o\u0000\u0000a\u000‌​0r\u0000.\u0000a\u00‌​00s\u0000e\u0000-\u0‌​000t\u0000-\u000....‌​... Я что-то упустил?

DJanssen 05.06.2024 11:37

Используете ли вы конвейеры Azure DevOps? $(Agent.TempDirectory) — это предопределенная переменная, не понимаю, почему она не распознается. Не забудьте использовать синтаксис $(myvariable).

Rui Jarimba 05.06.2024 11:42

Что именно вы подразумеваете под adding the secretFile as file to the key vault? Вы используете опцию --file, верно? Давайте сделаем шаг за шагом — может быть, еще раз проверим, имеет ли файл правильное значение?

Rui Jarimba 05.06.2024 11:46

@DJanssen добавил больше подробностей. Попробуйте указать кодировку.

Rui Jarimba 05.06.2024 11:55

Привет, @Rui, еще раз спасибо за ответ. Я использую конвейеры Azure DevOps. Когда я использовал $secretFile = "$(Agent.TempDirectory)/secret.txt" именно так, как вы упомянули, я получил следующий результат: snipboard.io/0RNxgf.jpg Я использовал следующую команду, чтобы сохранить его в ключе vault: az keyvault secret set --vault-name $keyVaultName --name "Name" --file $secretFile --output none Это привело к следующей ошибке на изображении. Затем я изменил его на $secretFile = [System.IO.Path]::Combine($env:AGENT_TEMPDIRECTORY, "secret.txt") и в результате получил значение u000t..

DJanssen 05.06.2024 12:15

Кстати, я использую классический редактор конвейеров и шаг Azure CLI для запуска сценария Powershell после развертывания ресурсов Azure и т. д. snipboard.io/SQ9xrG.jpg

DJanssen 05.06.2024 12:17

@DJanssen попробуйте указать кодировку. Смотрите мое редактирование.

Rui Jarimba 05.06.2024 12:32

Спасибо за редактирование, у нас были некоторые проблемы с конвейером, поэтому потребовалось время, чтобы его протестировать. Кажется, мы очень близки! Итак, следуя свойству -encoding utf8, мы видим правильный URL-адрес. Однако вначале мы видим эти символы:  Итак, значение, которое мы извлекаем из хранилища ключей:  X.appserviceenvironment.net:443/api/workflowname/triggers/… Если бы мы только могли избавиться из этих  персонажей нам пора идти :) Что бы вы посоветовали?

DJanssen 05.06.2024 14:22

Уродливым решением было бы запустить другую команду, которая фактически вырезала бы первые три символа секрета. Не уверен, что это вообще возможно, но я думаю, это может сработать

DJanssen 05.06.2024 14:23

@DJanssen при создании текстового файла попробуйте utf8NoBOM вместо utf8

Rui Jarimba 05.06.2024 14:30

это дает мне следующую ошибку в конвейере: snipboard.io/DSQLXT.jpg Вот как это выглядит в коде: snipboard.io/zKhasV.jpg

DJanssen 05.06.2024 15:03

Какую версию Powershell вы используете? Начиная с версии 6, powershell поддерживает кодировку UTF8NoBOM.

Rui Jarimba 05.06.2024 15:12

См. также обходной путь stackoverflow.com/a/5596984/558486.

Rui Jarimba 05.06.2024 15:13

у нас версия 5.1.... кажется. Так что нужно найти способ обновить его до 7.0. Тогда попробую utf8NoBOM, спасибо!

DJanssen 05.06.2024 15:24

@DJanssen, а пока попробуй обходной путь, о котором я упоминал.

Rui Jarimba 05.06.2024 15:27

Привет, просто хотел сообщить вам, что нам удалось обновить Powershell, и теперь значение рабочего процесса прекрасно сохраняется в хранилище ключей благодаря кодировке NoBom. Большое спасибо за вашу помощь! Ваше здоровье!

DJanssen 05.06.2024 17:45

@DJanssen рад узнать, что все работает нормально. К вашему сведению, вам даже не нужно указывать параметр -Encoding в самых последних версиях Powershell — его значение по умолчанию — utf8NoBOM.

Rui Jarimba 11.06.2024 11:12

Замените имя хранилища ключей на свое собственное, на моей стороне работает приведенный ниже скрипт:

$value = "https://wbtest.appserviceenvironment.net:443/api/NameWorkFlow/triggers/When_a_HTTP_request_is_received/invoke?api-version=2022-05-01&sp=%2Ftriggers%2FWhen_a_HTTP_request_is_received%2Frun&sv=1.0&sig=sigvaluehiddenhere"

$secret = ConvertTo-SecureString -String $value -AsPlainText -Force

Set-AzKeyVaultSecret -VaultName 'wbtestkv' -Name 'wbtestSecret2' -SecretValue $secret


Get-AzKeyVaultSecret -VaultName 'wbtestkv' -Name 'wbtestSecret2' -AsPlainText

Привет, спасибо за ответ! Я протестировал ваш код, но вот мой результат: В хранилище ключей отображается значение: System.Security.SecureString. Когда мой коллега вызывает это значение в рабочем процессе приложения логики с помощью соединителя хранилища ключей, результатом также является System.Security.SecureString. . Я делаю что-то неправильно?

DJanssen 05.06.2024 10:13

Я использую задачу Azure CLI для запуска сценария, и он работает нормально. URL-адрес рабочего процесса может быть установлен как секрет в Key Vault, как и ожидалось.

Ниже приведен мой образец в качестве ссылки:

# azure-pipelines.yml

# Replace the variable values with your actual values.
variables:
  armConnection: 'ARM-Service-Connection-Name'
  subscriptionId: 'Azure-Subscription-Id'
  resourceGroupName: 'Resource-Group-Name'
  logicAppName: 'BriRanLA'
  workflowName: 'testWorkflow'
  keyVaultName: 'BriRanKV'
  secretName: 'workflowURL'

steps:
- checkout: none
- task: AzureCLI@2
  displayName: 'Set Secret'
  inputs:
    azureSubscription: '$(armConnection)'
    scriptType: 'pscore'
    scriptLocation: 'inlineScript'
    inlineScript: |
      $reqUri = "https://management.azure.com/subscriptions/$(subscriptionId)/resourceGroups/$(resourceGroupName)/providers/Microsoft.Web/sites/$(logicAppName)/hostruntime/runtime/webhooks/workflow/api/management/workflows/$(workflowName)/triggers/When_a_HTTP_request_is_received/listCallbackUrl?api-version=2018-11-01"
      $workflowDetails = az rest --method post --uri $reqUri
      $urlResult = ($workflowDetails | ConvertFrom-Json).value
      az keyvault secret set --vault-name $(keyVaultName) --name $(secretName) --value $urlResult


Интересный! Возможно, у него не возникнет проблем при запуске его как InlineScript вместо указания пути. Я запомню это для будущих мероприятий!

DJanssen 05.06.2024 18:27

@DJanssen, вы пробовали использовать пример, приведенный выше в моем ответе? И может ли это сработать для вас?

Bright Ran-MSFT 06.06.2024 08:19

Другие вопросы по теме