Я пытаюсь использовать VST (теперь Azure DevOps) для выполнения конвейера CI/CD. Для моего конвейера сборки у меня есть очень базовая настройка, включающая в себя выполнение шагов восстановления, строительства, тестирования и публикации. < /p>
Для моего тестового этапа у меня есть его настройка для запуска двух тестовых проектов - один модульный тестовый проект и один проект тестирования интеграции. У меня есть настройка политики доступа к ключевым хранилищам, чтобы обеспечить доступ как для меня, так и для Azure DevOps. Когда я запускаю свои тесты локально, используя Visual Studio, так как я вошел в ту же учетную запись, которая имеет доступ к Vault Azure, я могу запустить тесты без каких -либо ошибок. < /p>
Мое приложение настроено для доступа к клавишу Vault, используя ниже настройку: < /p>
public static IWebHostBuilder CreateWebHostBuilder(string[] args) =>
WebHost.CreateDefaultBuilder(args)
.ConfigureAppConfiguration((ctx, builder) =>
{
var keyVaultEndpoint = GetKeyVaultEndpoint();
if (!string.IsNullOrEmpty(keyVaultEndpoint))
{
var azureServiceTokenProvider = new AzureServiceTokenProvider();
var keyVaultClient = new KeyVaultClient(new KeyVaultClient.AuthenticationCallback(azureServiceTokenProvider.KeyVaultTokenCallback));
builder.AddAzureKeyVault(keyVaultEndpoint, keyVaultClient, new DefaultKeyVaultSecretManager());
}
}
)
.UseStartup();
Когда я запускаю конвейер сборки, я использую размещенный экземпляр VS2017 для сборки своего проекта. Все работает, за исключением интеграционных тестов, которые пытаются получить доступ к хранилищу ключей. Я использую следующие пакеты:
Microsoft.Azure.Services.AppAuthentication — упрощает получениетокены доступа для сценариев аутентификации между службами Azure.
Microsoft.Azure.KeyVault — содержит методы для взаимодействия с Key Vault.
Microsoft.Extensions.Configuration.AzureKeyVault — содержит
расширения IConfiguration для Azure Key Vault
< /ul>
Я просто пытаюсь заставить свою сборку работать, проверяя прохождение как модульного, так и интеграционного тестов. Я пока не развертываю его в службе приложений. Модульные тесты выполняются без каких-либо проблем, поскольку я издеваюсь над различными сервисами. Мой интеграционный тест завершился неудачно с сообщениями об ошибках ниже. Как получить тестовый доступ к хранилищу ключей? Нужно ли мне добавлять какие-либо специальные политики доступа к моему хранилищу ключей для размещенной сборки VS2017? Не знаю, что делать, поскольку не вижу ничего выдающегося.
2018-10-16T00:37:04.6202055Z Test run for D:\a\1\s\SGIntegrationTests\bin\Release\netcoreapp2.1\SGIntegrationTests.dll(.NETCoreApp,Version=v2.1)
2018-10-16T00:37:05.3640674Z Microsoft (R) Test Execution Command Line Tool Version 15.8.0
2018-10-16T00:37:05.3641588Z Copyright (c) Microsoft Corporation. All rights reserved.
2018-10-16T00:37:05.3641723Z
2018-10-16T00:37:06.8873531Z Starting test execution, please wait...
2018-10-16T00:37:51.9955035Z [xUnit.net 00:00:40.80] SGIntegrationTests.HomeControllerShould.IndexContentTypeIsTextHtml [FAIL]
2018-10-16T00:37:52.0883568Z Failed SGIntegrationTests.HomeControllerShould.IndexContentTypeIsTextHtml
2018-10-16T00:37:52.0884088Z Error Message:
2018-10-16T00:37:52.0884378Z Microsoft.Azure.Services.AppAuthentication.AzureServiceTokenProviderException : Parameters: Connection String: [No connection string specified], Resource: https://vault.azure.net, Authority: https://login.windows.net/63cd8468-5bc3-4c0a-a6f8-1e314d696937. Exception Message: Tried the following 3 methods to get an access token, but none of them worked.
2018-10-16T00:37:52.0884737Z Parameters: Connection String: [No connection string specified], Resource: https://vault.azure.net, Authority: https://login.windows.net/63cd8468-5bc3-4c0a-a6f8-1e314d696937. Exception Message: Tried to get token using Managed Service Identity. Access token could not be acquired. MSI ResponseCode: BadRequest, Response: {"error":"invalid_request","error_description":"Identity not found"}
2018-10-16T00:37:52.0884899Z Parameters: Connection String: [No connection string specified], Resource: https://vault.azure.net, Authority: https://login.windows.net/63cd8468-5bc3-4c0a-a6f8-1e314d696937. Exception Message: Tried to get token using Visual Studio. Access token could not be acquired. Visual Studio Token provider file not found at "C:\Users\VssAdministrator\AppData\Local\.IdentityService\AzureServiceAuth\tokenprovider.json"
2018-10-16T00:37:52.0885142Z Parameters: Connection String: [No connection string specified], Resource: https://vault.azure.net, Authority: https://login.windows.net/63cd8468-5bc3-4c0a-a6f8-1e314d696937. Exception Message: Tried to get token using Azure CLI. Access token could not be acquired. Process took too long to return the token.
2018-10-16T00:37:52.0885221Z
2018-10-16T00:37:52.0885284Z Stack Trace:
2018-10-16T00:37:52.0885349Z at Microsoft.Azure.Services.AppAuthentication.AzureServiceTokenProvider.GetAccessTokenAsyncImpl(String authority, String resource, String scope)
2018-10-16T00:37:52.0885428Z at Microsoft.Azure.KeyVault.KeyVaultCredential.PostAuthenticate(HttpResponseMessage response)
2018-10-16T00:37:52.0885502Z at Microsoft.Azure.KeyVault.KeyVaultCredential.ProcessHttpRequestAsync(HttpRequestMessage request, CancellationToken cancellationToken)
2018-10-16T00:37:52.0886831Z at Microsoft.Azure.KeyVault.KeyVaultClient.GetSecretsWithHttpMessagesAsync(String vaultBaseUrl, Nullable`1 maxresults, Dictionary`2 customHeaders, CancellationToken cancellationToken)
2018-10-16T00:37:52.0886887Z at Microsoft.Azure.KeyVault.KeyVaultClientExtensions.GetSecretsAsync(IKeyVaultClient operations, String vaultBaseUrl, Nullable`1 maxresults, CancellationToken cancellationToken)
2018-10-16T00:37:52.0886935Z at Microsoft.Extensions.Configuration.AzureKeyVault.AzureKeyVaultConfigurationProvider.LoadAsync()
2018-10-16T00:37:52.0887000Z at Microsoft.Extensions.Configuration.AzureKeyVault.AzureKeyVaultConfigurationProvider.Load()
2018-10-16T00:37:52.0887045Z at Microsoft.Extensions.Configuration.ConfigurationRoot..ctor(IList`1 providers)
2018-10-16T00:37:52.0887090Z at Microsoft.Extensions.Configuration.ConfigurationBuilder.Build()
2018-10-16T00:37:52.0887269Z at Microsoft.AspNetCore.Hosting.WebHostBuilder.BuildCommonServices(AggregateException& hostingStartupErrors)
2018-10-16T00:37:52.0887324Z at Microsoft.AspNetCore.Hosting.WebHostBuilder.Build()
2018-10-16T00:37:52.0887371Z at Microsoft.AspNetCore.TestHost.TestServer..ctor(IWebHostBuilder builder, IFeatureCollection featureCollection)
2018-10-16T00:37:52.0887433Z at Microsoft.AspNetCore.Mvc.Testing.WebApplicationFactory`1.CreateServer(IWebHostBuilder builder)
2018-10-16T00:37:52.0887477Z at Microsoft.AspNetCore.Mvc.Testing.WebApplicationFactory`1.EnsureServer()
2018-10-16T00:37:52.0887525Z at Microsoft.AspNetCore.Mvc.Testing.WebApplicationFactory`1.CreateDefaultClient(DelegatingHandler[] handlers)
< /code>
обновление < /h2>
Я нашел только 1 связанный пост К этому вопросу: https://social.msdn.microsoft.com/forums/en-us/0bac778a-283a-4be1-bc75-605e776adac0/managed-service-identity-issue?forum=windowsazurewebsitespreview. Но пост связан с развертыванием приложения в слот Azure. Я просто пытаюсь построить свое приложение в конвейере. < /p>
Я все еще пытаюсь решить эту проблему и не уверен, что такое лучший способ обеспечить необходимый доступ. < /p>
обновление 2 < /h2>
Я до сих пор не нашел Решение для этого. Я потерял, как получить свой трубопровод, чтобы провести тест без проблем. Я увидел, что выпускный трубопровод у вас также есть варианты запуска тестов. Но они, кажется, принимают файлы .dll, а в моем файле Drop Pipeline Drop File имеет только веб -приложение (я не вижу никаких тестовых проектов, опубликованных Drop File). Не уверен, что это даже возможно. Мне удалось заставить его работать, используя последнюю опцию, предоставленную здесь: https://learn.microsoft.com/en-us/azure/key-wault/service-to-service-authentication#connection-string- Поддержка < /p>
Я попробовал другие способы использования сертификата, но в любое время {currentUser} в строке подключения приводится в сборе конвейера сборки. Он работает на моей местной машине, но не в конвейере сборки. < /p>
Чтобы заставить его работать, мне пришлось сделать три вещи: < /p>
[*] Войдите в Azure. Настройка новой регистрации приложения в Azure ad < /li>
В вашей новой регистрации приложения AD создайте новый секрет клиента
[*] Предоставьте доступ к новому приложению AD к своему своему своему хранилищу. Зайдите в свои политики доступа к ключам и добавьте приложение, которое вы создали в своем объявлении, с доступом к чтению в ваши секреты. /wzoj2.png "/>
[*] изменил мой призыв к [b] azureservicetokenprovier () [/b] в моем сильном > Program.cs < /strong> файл следующим образом: < /p>
var azureServiceTokenProvider = new AzureServiceTokenProvider("connectionString={your key vault endpoint};RunAs=App;AppId={your app id that you setup in Azure AD};TenantId={your azure subscription};AppKey={your client secret key}")
Обратите внимание, что секрет клиента должен быть правильно отформатирован. При регистрации приложения (предварительная версия) генерируется случайный секретный ключ. Иногда этот ключ не работает в строке подключения (выдает ошибку, как неправильно отформатированный). Либо попробуйте сгенерировать собственный ключ в непредварительной версии регистрации приложения, либо сгенерируйте новый ключ и повторите попытку.
После этого я смог запустить интеграционный тест в мой конвейер сборки успешно и создаю выпуск для моего веб-приложения в Azure. Меня не устраивает этот подход, потому что, хотя он и работает, он раскрывает секретное значение в самом коде. В соответствии с описанным выше подходом не требуется включать службу управления удостоверениями. Я считаю, что в этом отношении это крайне плохо.
Должен быть лучший способ. Один из вариантов — не запускать интеграционный тест в конвейере сборки. Не уверен, что это правильный подход. Я все еще надеюсь, что кто-нибудь сможет предложить лучший подход к этому или объяснить, можно ли использовать мой подход.
Я пытаюсь использовать VST (теперь Azure DevOps) для выполнения конвейера CI/CD. Для моего конвейера сборки у меня есть очень базовая настройка, включающая в себя выполнение шагов восстановления, строительства, тестирования и публикации. < /p>
Для моего тестового этапа у меня есть его настройка для запуска двух тестовых проектов - один модульный тестовый проект и один проект тестирования интеграции. У меня есть настройка политики доступа к ключевым хранилищам, чтобы обеспечить доступ как для меня, так и для Azure DevOps. Когда я запускаю свои тесты локально, используя Visual Studio, так как я вошел в ту же учетную запись, которая имеет доступ к Vault Azure, я могу запустить тесты без каких -либо ошибок. < /p>
Мое приложение настроено для доступа к клавишу Vault, используя ниже настройку: < /p>
[code] public static IWebHostBuilder CreateWebHostBuilder(string[] args) => WebHost.CreateDefaultBuilder(args) .ConfigureAppConfiguration((ctx, builder) => { var keyVaultEndpoint = GetKeyVaultEndpoint();
if (!string.IsNullOrEmpty(keyVaultEndpoint)) { var azureServiceTokenProvider = new AzureServiceTokenProvider(); var keyVaultClient = new KeyVaultClient(new KeyVaultClient.AuthenticationCallback(azureServiceTokenProvider.KeyVaultTokenCallback)); builder.AddAzureKeyVault(keyVaultEndpoint, keyVaultClient, new DefaultKeyVaultSecretManager()); } } ) .UseStartup(); [/code]
Когда я запускаю конвейер сборки, я использую размещенный экземпляр VS2017 для сборки своего проекта. Все работает, за исключением интеграционных тестов, которые пытаются получить доступ к хранилищу ключей. Я использую следующие пакеты:
[list] [*][b]Microsoft.Azure.Services.AppAuthentication[/b] — упрощает получениетокены доступа для сценариев аутентификации между службами Azure. [*][b]Microsoft.Azure.KeyVault[/b] — содержит методы для взаимодействия с Key Vault. [*][b]Microsoft.Extensions.Configuration.AzureKeyVault[/b] — содержит
расширения IConfiguration для Azure Key Vault < /ul>
Я следовал этому руководству https://learn.microsoft.com/en-us/azure/key-vault/tutorial-web-application-keyvault, чтобы настроить хранилище ключей. и интегрировать его в мое приложение.
Я просто пытаюсь заставить свою сборку работать, проверяя прохождение как модульного, так и интеграционного тестов. Я пока не развертываю его в службе приложений. Модульные тесты выполняются без каких-либо проблем, поскольку я издеваюсь над различными сервисами. Мой интеграционный тест завершился неудачно с сообщениями об ошибках ниже. Как получить тестовый доступ к хранилищу ключей? Нужно ли мне добавлять какие-либо специальные политики доступа к моему хранилищу ключей для размещенной сборки VS2017? Не знаю, что делать, поскольку не вижу ничего выдающегося.
[img]https://i.sstatic.net /slceb.jpg[/img]
Ниже приведена трассировка стека ошибки:
[code] 2018-10-16T00:37:04.6202055Z Test run for D:\a\1\s\SGIntegrationTests\bin\Release\netcoreapp2.1\SGIntegrationTests.dll(.NETCoreApp,Version=v2.1) 2018-10-16T00:37:05.3640674Z Microsoft (R) Test Execution Command Line Tool Version 15.8.0 2018-10-16T00:37:05.3641588Z Copyright (c) Microsoft Corporation. All rights reserved. 2018-10-16T00:37:05.3641723Z 2018-10-16T00:37:06.8873531Z Starting test execution, please wait... 2018-10-16T00:37:51.9955035Z [xUnit.net 00:00:40.80] SGIntegrationTests.HomeControllerShould.IndexContentTypeIsTextHtml [FAIL] 2018-10-16T00:37:52.0883568Z Failed SGIntegrationTests.HomeControllerShould.IndexContentTypeIsTextHtml 2018-10-16T00:37:52.0884088Z Error Message: 2018-10-16T00:37:52.0884378Z Microsoft.Azure.Services.AppAuthentication.AzureServiceTokenProviderException : Parameters: Connection String: [No connection string specified], Resource: https://vault.azure.net, Authority: https://login.windows.net/63cd8468-5bc3-4c0a-a6f8-1e314d696937. Exception Message: Tried the following 3 methods to get an access token, but none of them worked. 2018-10-16T00:37:52.0884737Z Parameters: Connection String: [No connection string specified], Resource: https://vault.azure.net, Authority: https://login.windows.net/63cd8468-5bc3-4c0a-a6f8-1e314d696937. Exception Message: Tried to get token using Managed Service Identity. Access token could not be acquired. MSI ResponseCode: BadRequest, Response: {"error":"invalid_request","error_description":"Identity not found"} 2018-10-16T00:37:52.0884899Z Parameters: Connection String: [No connection string specified], Resource: https://vault.azure.net, Authority: https://login.windows.net/63cd8468-5bc3-4c0a-a6f8-1e314d696937. Exception Message: Tried to get token using Visual Studio. Access token could not be acquired. Visual Studio Token provider file not found at "C:\Users\VssAdministrator\AppData\Local\.IdentityService\AzureServiceAuth\tokenprovider.json" 2018-10-16T00:37:52.0885142Z Parameters: Connection String: [No connection string specified], Resource: https://vault.azure.net, Authority: https://login.windows.net/63cd8468-5bc3-4c0a-a6f8-1e314d696937. Exception Message: Tried to get token using Azure CLI. Access token could not be acquired. Process took too long to return the token. 2018-10-16T00:37:52.0885221Z 2018-10-16T00:37:52.0885284Z Stack Trace: 2018-10-16T00:37:52.0885349Z at Microsoft.Azure.Services.AppAuthentication.AzureServiceTokenProvider.GetAccessTokenAsyncImpl(String authority, String resource, String scope) 2018-10-16T00:37:52.0885428Z at Microsoft.Azure.KeyVault.KeyVaultCredential.PostAuthenticate(HttpResponseMessage response) 2018-10-16T00:37:52.0885502Z at Microsoft.Azure.KeyVault.KeyVaultCredential.ProcessHttpRequestAsync(HttpRequestMessage request, CancellationToken cancellationToken) 2018-10-16T00:37:52.0886831Z at Microsoft.Azure.KeyVault.KeyVaultClient.GetSecretsWithHttpMessagesAsync(String vaultBaseUrl, Nullable`1 maxresults, Dictionary`2 customHeaders, CancellationToken cancellationToken) 2018-10-16T00:37:52.0886887Z at Microsoft.Azure.KeyVault.KeyVaultClientExtensions.GetSecretsAsync(IKeyVaultClient operations, String vaultBaseUrl, Nullable`1 maxresults, CancellationToken cancellationToken) 2018-10-16T00:37:52.0886935Z at Microsoft.Extensions.Configuration.AzureKeyVault.AzureKeyVaultConfigurationProvider.LoadAsync() 2018-10-16T00:37:52.0887000Z at Microsoft.Extensions.Configuration.AzureKeyVault.AzureKeyVaultConfigurationProvider.Load() 2018-10-16T00:37:52.0887045Z at Microsoft.Extensions.Configuration.ConfigurationRoot..ctor(IList`1 providers) 2018-10-16T00:37:52.0887090Z at Microsoft.Extensions.Configuration.ConfigurationBuilder.Build() 2018-10-16T00:37:52.0887269Z at Microsoft.AspNetCore.Hosting.WebHostBuilder.BuildCommonServices(AggregateException& hostingStartupErrors) 2018-10-16T00:37:52.0887324Z at Microsoft.AspNetCore.Hosting.WebHostBuilder.Build() 2018-10-16T00:37:52.0887371Z at Microsoft.AspNetCore.TestHost.TestServer..ctor(IWebHostBuilder builder, IFeatureCollection featureCollection) 2018-10-16T00:37:52.0887433Z at Microsoft.AspNetCore.Mvc.Testing.WebApplicationFactory`1.CreateServer(IWebHostBuilder builder) 2018-10-16T00:37:52.0887477Z at Microsoft.AspNetCore.Mvc.Testing.WebApplicationFactory`1.EnsureServer() 2018-10-16T00:37:52.0887525Z at Microsoft.AspNetCore.Mvc.Testing.WebApplicationFactory`1.CreateDefaultClient(DelegatingHandler[] handlers) < /code>
обновление < /h2>
Я нашел только 1 связанный пост К этому вопросу: https://social.msdn.microsoft.com/forums/en-us/0bac778a-283a-4be1-bc75-605e776adac0/managed-service-identity-issue?forum=windowsazurewebsitespreview. Но пост связан с развертыванием приложения в слот Azure. Я просто пытаюсь построить свое приложение в конвейере. < /p>
Я все еще пытаюсь решить эту проблему и не уверен, что такое лучший способ обеспечить необходимый доступ. < /p>
обновление 2 < /h2>
Я до сих пор не нашел Решение для этого. Я потерял, как получить свой трубопровод, чтобы провести тест без проблем. Я увидел, что выпускный трубопровод у вас также есть варианты запуска тестов. Но они, кажется, принимают файлы .dll, а в моем файле Drop Pipeline Drop File имеет только веб -приложение (я не вижу никаких тестовых проектов, опубликованных Drop File). Не уверен, что это даже возможно. Мне удалось заставить его работать, используя последнюю опцию, предоставленную здесь: https://learn.microsoft.com/en-us/azure/key-wault/service-to-service-authentication#connection-string- Поддержка < /p>
Я попробовал другие способы использования сертификата, но в любое время {currentUser} в строке подключения приводится в сборе конвейера сборки. Он работает на моей местной машине, но не в конвейере сборки. < /p>
Чтобы заставить его работать, мне пришлось сделать три вещи: < /p>
[*] Войдите в Azure. Настройка новой регистрации приложения в Azure ad < /li> В вашей новой регистрации приложения AD создайте новый секрет клиента
[*] Предоставьте доступ к новому приложению AD к своему своему своему хранилищу. Зайдите в свои политики доступа к ключам и добавьте приложение, которое вы создали в своем объявлении, с доступом к чтению в ваши секреты. /wzoj2.png "/> [*] изменил мой призыв к [b] azureservicetokenprovier () [/b] в моем сильном > Program.cs < /strong> файл следующим образом: < /p>
var azureServiceTokenProvider = new AzureServiceTokenProvider("connectionString={your key vault endpoint};RunAs=App;AppId={your app id that you setup in Azure AD};TenantId={your azure subscription};AppKey={your client secret key}") [/code] [/list]
Обратите внимание, что секрет клиента должен быть правильно отформатирован. При регистрации приложения (предварительная версия) генерируется случайный секретный ключ. Иногда этот ключ не работает в строке подключения (выдает ошибку, как неправильно отформатированный). Либо попробуйте сгенерировать собственный ключ в непредварительной версии регистрации приложения, либо сгенерируйте новый ключ и повторите попытку.
После этого я смог запустить интеграционный тест в мой конвейер сборки успешно и создаю выпуск для моего веб-приложения в Azure. Меня не устраивает этот подход, потому что, хотя он и работает, он раскрывает секретное значение в самом коде. В соответствии с описанным выше подходом не требуется включать службу управления удостоверениями. Я считаю, что в этом отношении это крайне плохо.
Должен быть лучший способ. Один из вариантов — не запускать интеграционный тест в конвейере сборки. Не уверен, что это правильный подход. Я все еще надеюсь, что кто-нибудь сможет предложить лучший подход к этому или объяснить, можно ли использовать мой подход.
setup
Я запускаю веб -приложение .NET 6 в приложении Azure Container и доступ к Key Vault Azure для секретов и строк соединения.
Внедрение зависимостей отлично подходит для инъекции моего пользовательского клиента Vault Cualt (обертка...
setup
Я запускаю веб -приложение .NET 6 в приложении Azure Container и доступ к Key Vault Azure для секретов и строк соединения.
Внедрение зависимостей отлично подходит для инъекции моего пользовательского клиента Vault Cualt (обертка...
Новичок в Visual Studio 2022 через несколько лет от кодирования C#. Создание простого основного сайта ASP.NET, который я развертываю в Azure с App Services, просто чтобы почувствовать все это. Секреты хранятся в JSON, поэтому вы можете легко их...
Цель – создать пакеты nuget, содержащие скомпилированные сборки C#, код которых подписан с сертификатом, который хранится в Azure Key Vault во время сборки CI/CD с помощью конвейера YAML Azure Devops. >
Что у меня сейчас (автоматизировано в...
Я пытаюсь получить секреты из Azure Key Vault, используя следующий код:
var client = new SecretClient(new Uri(vaultBaseUrl), credential);
KeyVaultSecret secret = client.GetSecret(secretName);