Я пытаюсь получить секреты из хранилища ключей Azure, используя идентификатор службы в веб-приложении ASPNet 4.6.2.Я использую код, описанный в этой статье .Локально, все работает нормально, хотя это потому, что он использует мою личность.При развертывании приложения в Azure я получаю исключение при вызове keyVaultClient.GetSecretAsync(keyUrl)
.
Насколько я могу судить, все настроено правильно.Я создал идентификатор, назначенный Пользователем, чтобы его можно было повторно использовать, и убедился, что идентификатор имеет get доступ к секретам и ключам в политике KeyVault.
Исключением является AzureServiceTokenProviderException
.Он многословен и обрисовывает в общих чертах, как он попробовал четыре метода аутентификацииМеня беспокоит информация, когда он пытается использовать идентификатор управляемой службы:
Пытался получить токен с использованием идентификатора управляемой службы.Не удалось получить токен доступа.MSI ResponseCode: BadRequest, Response:
Я проверил понимание приложения и увидел, что оно попыталось установить следующее соединение с ошибкой 400 результатов:
http://127.0.0.1:41340/MSI/token/?resource=https://vault.azure.net&api-version=2017-09-01
Есть две интересные вещипо этому поводу:
- Почему он пытается подключиться к локальному адресу?Это кажется неправильным.
- Может ли это быть возвращением 400, потому что параметр ресурса не экранирован?
- В MsiAccessTokenProvider source он использует только эту формуадрес, когда установлены переменные окружения MSI_ENDPOINT и MSI_SECRET.Они не установлены в настройках приложения, но я вижу их в консоли отладки при выводе переменных среды.
На данный момент я не знаю, что делать.Все примеры в сети кажутся волшебными, но если я прав в отношении источника проблемы, то есть некоторые неясные автоматические настройки, которые необходимо исправить.
Для полноты здесь приведен весь мой соответствующий код:
public class ServiceIdentityKeyVaultUtil : IDisposable
{
private readonly AzureServiceTokenProvider azureServiceTokenProvider;
private readonly Uri baseSecretsUri;
private readonly KeyVaultClient keyVaultClient;
public ServiceIdentityKeyVaultUtil(string baseKeyVaultUrl)
{
baseSecretsUri = new Uri(new Uri(baseKeyVaultUrl, UriKind.Absolute), "secrets/");
azureServiceTokenProvider = new AzureServiceTokenProvider();
keyVaultClient = new KeyVaultClient(
new KeyVaultClient.AuthenticationCallback(azureServiceTokenProvider.KeyVaultTokenCallback));
}
public async Task<string> GetSecretAsync(string key, CancellationToken cancellationToken = new CancellationToken())
{
var keyUrl = new Uri(baseSecretsUri, key).ToString();
try
{
var secret = await keyVaultClient.GetSecretAsync(keyUrl, cancellationToken);
return secret.Value;
}
catch (Exception ex)
{
/** rethrows error with extra details */
}
}
/** IDisposable support */
}
ОБНОВЛЕНИЕ № 2 (я удалил обновление № 1)
Я создал совершенно новое приложение или новый экземпляр службы и смогвоссоздать ошибку. Однако , во всех случаях я использовал User Assigned Identity .Если я удаляю это и использую System Assigned Identity , тогда он работает просто отлично.
Я не знаю, почему они будут другими.У любого есть понимание, поскольку я предпочел бы назначенный пользователем.