Как получить токен доступа Azure с помощью DefaultAzureCredential без сохранения секретов
Я пытаюсь настроить свою среду, чтобы иметь доступ к ресурсам Azure из-за пределов Azure.
При просмотре различных вариантов я наткнулся в основном на варианты ниже многих других.
Вариант 1. Создание субъекта-службы с помощью Azure CLI и использование секретов клиента для извлечения токена и доступа к ресурсам . Получение секретов клиента во время выполнения.
Вариант 2. Использование DefaultAzureCredential (Azure.Identity) для извлечения токена и доступа к ресурсам DefaultAzureCredential
В настоящее время я пробую вариант DefaultAzureCredential, чтобы иметь доступ к ресурсам Azure, таким как ADF, хранилище BLOB-объектов и т. д.
Я могу сделать это, используя учетные данные Visual Studio (VS 2019). Однако остается проблема выполнения того же действия через конвейер, работающий за пределами Azure. Я не хочу сохранять какие-либо секреты в коде. Означает ли это, что я не могу использовать переменные среды для Цели?
Если это действительно возможно, тогда нужна помощь с кодом.
Окружающая среда : . Сетевая структура 4.8/ядро 3.1
Желаемый поток:
Используйте учетные данные Visual Studio для локальной разработки и тестирования.
Используйте переменные среды ИЛИ другие задачи, поддерживаемые DefaultAzureCredential через задачу DevOps Pipeline.
Код:
var tokenCredential = new DefaultAzureCredential();
var accessToken = await tokenCredential.GetTokenAsync(
new TokenRequestContext(scopes: new string[] { ResourceId + "/.default" }) { }
);
1 ответ
Я смог решить эту проблему с помощью DefaultAzureCredential. Мы следовали приведенному ниже подходу, чтобы решить эту проблему.
- Добавлен код для чтения секретов из appsetting.json.
- Добавить секреты к переменным среды
- Используйте DefaultAzureCredential*, чтобы исправить переопределение.
- Добавьте задачу замены токена в конвейеры сборки/выпуска, чтобы заменить секретные переменные клиента секретами из параметров конвейера.
- Код при выполнении из Visual Studio не находит фактического значения секретных переменных из appsetting.json, а затем использует учетные данные VisualStudio.
Чтение значений
string AZURE_CLIENT_SECRET = ConfigurationHelper.GetByName("AZURE_CLIENT_SECRET");
string AZURE_CLIENT_ID = ConfigurationHelper.GetByName("AZURE_CLIENT_ID");
string AZURE_TENANT_ID = ConfigurationHelper.GetByName("AZURE_TENANT_ID");
// Check whether the environment variable exists.
if (AZURE_CLIENT_SECRET != "{{AZURE_CLIENT_SECRET}}"
&& AZURE_CLIENT_ID != "{{AZURE_CLIENT_ID}}" &&
AZURE_TENANT_ID != "{{AZURE_TENANT_ID}}")
{
Environment.SetEnvironmentVariable("AZURE_CLIENT_SECRET", AZURE_CLIENT_SECRET);
Environment.SetEnvironmentVariable("AZURE_CLIENT_ID", AZURE_CLIENT_ID);
Environment.SetEnvironmentVariable("AZURE_TENANT_ID", AZURE_TENANT_ID);
Console.WriteLine("Setting Environment Variables");
}
Вызов DefaultAzureCredential
var objDefaultAzureCredentialOptions = new DefaultAzureCredentialOptions
{
ExcludeEnvironmentCredential = false,
ExcludeManagedIdentityCredential = true,
ExcludeSharedTokenCacheCredential = true,
ExcludeVisualStudioCredential = false,
ExcludeVisualStudioCodeCredential = false,
ExcludeAzureCliCredential = true,
ExcludeInteractiveBrowserCredential = true
};
var tokenCredential = new DefaultAzureCredential(objDefaultAzureCredentialOptions);
ValueTask<AccessToken> accessToken = tokenCredential.GetTokenAsync(
new TokenRequestContext(scopes: new[] { "https://management.azure.com/.default" }));
- Если переменные среды присутствуют в активном сеансе, код использует переменные среды.