it-swarm.com.ru

Невозможно получить доступ к хранилищу ключей Azure из функции - возврат запрещен

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

AzureServiceTokenProvider azureServiceTokenProvider = new AzureServiceTokenProvider();
KeyVaultClient kvClient = new KeyVaultClient(new KeyVaultClient.AuthenticationCallback(azureServiceTokenProvider.KeyVaultTokenCallback));

//(https://keyvaultname.vault.Azure.net/)
var keyVaultUrl = Environment.GetEnvironmentVariable("KeyVaultLocation"); 

//(name of the secret)
var vaultSecretKey = Environment.GetEnvironmentVariable("VaultSecretKey"); 

var value = (await kvClient.GetSecretAsync(keyVaultUrl, vaultSecretKey)).Value;

Я выводю исключения в журнал, и последняя строка, где я жду значение секрета, выдает это исключение: 

Операция вернула недопустимый код состояния «Запрещено».

Я уже зарегистрировал функцию в политиках доступа к хранилищу ключей и дал ей разрешения на получение секретов, и я включил для этой функции удостоверение управляемой службы. Что-то еще мне не хватает? Я в недоумении, почему функция не может получить доступ к хранилищу.

4
Jake

Вот как я использую KeyVaultClient в своей функции Azure (v2). У меня есть метод, который возвращает токен доступа на основе идентификатора приложения и секретного ключа, настроенного для хранилища:

/// <summary>
/// Called by the KeyVaultClient instance.
/// </summary>
/// <param name="authority"></param>
/// <param name="resource"></param>
/// <param name="scope"></param>
/// <returns></returns>
private static async Task<string> GetAccessTokenAsync(string authority, string resource, string scope)
{
    var clientCredential = new ClientCredential(Constants.Vault.AppId, Constants.Vault.AppSecret);

    var context = new AuthenticationContext(authority, TokenCache.DefaultShared);

    AuthenticationResult result = await context.AcquireTokenAsync(resource, clientCredential);

    return result.AccessToken;
}

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

...
//  Pushes the encryption to the Key-Vault.
var client = new KeyVaultClient(GetAccessTokenAsync, new HttpClient());

await client.GetSecretAsync(Constants.Vault.Url, vaultSecretKey);
2
Kzrystof

Хорошо, вот как я это получил, благодаря Dom :

Я несколько раз пытался включить и отключить MSI для приложения-функции. Затем перешел к политике доступа KeyVault и назначил необходимые разрешения соответствующему субъекту службы для приложения-функции.

Я также обнаружил, что назначение идентификатора с помощью сценария PowerShell работает сразу, поэтому, вероятно, это лучше, чем несколько раз включать и отключать MSI на портале:

Set-AzureRmWebApp -AssignIdentity $true -Name $webappname -ResourceGroupName myResourceGroup
1
Kayes

Также дважды проверьте ваш AppId и AppSecret, переданные в функцию ClientCredential. У нас есть несколько ключевых хранилищ, и неверные учетные данные хранилища были сохранены в настройках приложения-функции Azure.

0
Stephen

У меня была похожая проблема. Я работал в двух разных вкладках веб-браузера: одна для редактирования настроек приложения-функции Azure, другая для назначения роли на ресурсе. Не уверен, что это связано, но когда я закрыл вторую вкладку и перенастроил все из одной вкладки, все стало работать правильно.

0
regrebud

у вас должна быть учетная запись автоматизации и учетная запись учетных данных, добавленная в политику доступа для ее запуска в Runbook с Powershell. Это было для меня новостью. Не осознавал, что это были 2 аккаунта против 1. Я продолжал получать запреты, просто не знал, к каким аккаунтам нужен доступ.

0
Mike K