Невозможно подключиться к Azure Key Vault из Azure Web App - PullRequest
0 голосов
/ 01 апреля 2020

Я пытаюсь получить доступ к Azure хранилищу ключей из моей Azure Службы приложений. Я выполнил действия, описанные в этой документации: https://docs.microsoft.com/en-us/azure/key-vault/managed-identity (включил идентификацию, назначенную системой для службы приложений, обновил политику доступа к хранилищу ключей, включив в нее приложение с разрешениями Get, List secret). Однако, когда я запускаю веб-приложение, оно не может получить секрет из хранилища ключей, и моя веб-служба обнаруживает следующую ошибку: 502. Веб-сервер получил неверный ответ, выступая в качестве шлюза или прокси-сервера. Проблема со страницей, которую вы ищете, и она не может быть отображена. Когда веб-сервер (действуя в качестве шлюза или прокси-сервера) связался с вышестоящим контент-сервером, он получил неверный ответ от контент-сервера. Вот как выглядит мой код:

AzureServiceTokenProvider azureServiceTokenProvider = new AzureServiceTokenProvider();
KeyVaultClient keyVaultClient = new KeyVaultClient(new KeyVaultClient.AuthenticationCallback(azureServiceTokenProvider.KeyVaultTokenCallback));
var secret = keyVaultClient.GetSecretAsync(KeyVaultUrl);
authenticationKey = secret.Result.Value;

Служба застряла в строке secret.Result.Value. Есть ли что-то еще, что мне нужно сделать?

Ответы [ 2 ]

0 голосов
/ 03 апреля 2020

Когда вы проводите локальное тестирование:

Добавьте вашу подписанную учетную запись против azure keyvault. Go в keyvault> Политика доступа> добавьте свою учетную запись с get секретным разрешением.

Когда вы публикуете sh в azure:

1.Включите веб-приложение MSI.

2. Go в keyvault> Политика доступа> добавьте субъект-службу вашего веб-приложения с секретным разрешением get.

Код:

AzureServiceTokenProvider azureServiceTokenProvider = new AzureServiceTokenProvider();
KeyVaultClient keyVaultClient = new KeyVaultClient(new Microsoft.Azure.KeyVault.KeyVaultClient.AuthenticationCallback(azureServiceTokenProvider.KeyVaultTokenCallback));
var secret = keyVaultClient.GetSecretAsync("https://yourkevaultname.vault.azure.net/secrets/secretname/437d301daxxxxxx");
var authenticationKey = secret.Result.Value;
ViewBag.Message = authenticationKey.ToString();
0 голосов
/ 02 апреля 2020

Это намного проще с новым пакетом, как Azure .Security.KeyVault.Secrets. Вместе с Azure .Identity вы можете просто передать DefaultAzureCredential, как в наших примерах .

var client = new SecretClient(
  new Uri("https://myvault.vault.azure.net"), 
  new DefaultAzureCredential());
KeyVaultSecret secret = await client.GetSecretAsync("secret-name");
string authenticationKey = secret.Value;

. DefaultAzureCredential оптимизирован для работы с управляемой идентификацией, принципалами службы из среды и интерактивных входов в систему для поддержки одного и того же кода, работающего как в рабочей среде, так и на компьютерах разработчиков. Новые библиотеки также быстрее с меньшим количеством выделенных ресурсов и имеют гораздо лучшую диагностику - по умолчанию включается при использовании Azure Application Monitor.

Они предназначены для netstandard2.0, поэтому должны быть совместимы со старыми пакетами, которые они заменяют. Вы могли бы обновить? Мы делаем критические исправления только для более старых пакетов и рекомендуем людям обновлять до Azure. * Пакетов для более старых пакетов Microosft. Azure. *.

Что касается самой проблемы, то это сложно сказать, не зная, когда вы звоните это в вашем приложении. Во время запуска? Какая версия. NET? Что вы используете для своего ASP. NET каркаса приложения?

Хотя это, вероятно, не является причиной проблемы, трудно игнорировать, что вы вызываете асинхронный метод c синхронно, что также может вызвать проблемы. Если вы используете асинхронный метод c, вы должны написать свой код следующим образом:

var secret = await keyVaultClient.GetSecretAsync(KeyVaultUrl);
authenticationKey = secret.Value;

Если нет, позвоните:

var secret = keyVaultClient.GetSecretAsnc(KeyVaultUrl).GetAwaiter().GetResult();

Однако это не рекомендуется. В новых пакетах, о которых я упоминал выше, у нас есть версии syn c и asyn c, которые либо syn c, либо asyn c на протяжении всего стека вызовов и безопаснее в использовании. Как правило, однако, вы должны использовать вызовы asyn c - особенно для сетевого трафика c, например, для доступа к Key Vault, потому что, в зависимости от того, какой поток вы вызываете, он может повесить ваш пользовательский интерфейс.

...