Фон
У нас есть решение ASP.NET Core 2.1 с микросервисами, содержащими методы WebApi. Мы используем Identity Server 4 для аутентификации. У нас есть эти услуги, каждая в отдельном проекте.
- crm. Содержит различные методы WebAPI.
- мошенничество. Содержит различные методы WebAPI.
- уведомления. Содержит различные методы WebAPI.
- аутентификация. Содержит реализацию IdentityServer.
Служба аутентификации не имеет контроллера или методов WebAPI, это просто то, где настроен и реализован IdentityServer4. Ресурсы, клиенты, области и т. Д. Определены здесь, а в Startup также есть инициализация:
// Identity Server
services.AddIdentityServer()
.AddSigningCredential(Configuration.GetValue<string>("Certificates:TokenCertificate"), System.Security.Cryptography.X509Certificates.StoreLocation.LocalMachine, NameType.Thumbprint)
.AddInMemoryApiResources(Config.GetApiResources())
.AddInMemoryClients(Config.GetClients(Configuration))
.AddResourceOwnerValidator<ResourceOwnerPasswordValidator>()
.AddProfileService<ProfileService>();
Наша аутентификация работает нормально, когда мы тестируем с помощью Postman, мы должны сначала подключиться к конечной точке токена службы аутентификации и запросить токен-носитель. Затем мы можем передать его в заголовке запроса авторизации, и он работает нормально.
Пришло время обновить наши интеграционные тесты, потому что все они терпят неудачу, поскольку мы внедрили аутентификацию, они возвращают статус Unauthorized, чего и следовало ожидать.
Вопрос
Как нам вызвать службу аутентификации из наших интеграционных тестов, если это отдельный микросервис?
Мы следовали стандартным методам создания интеграционных тестов для наших микросервисов. У нас есть один тестовый проект для каждого микросервиса, и один класс фикстур создает webHostBuilder, используя Startup этого микросервиса, и testServer HttpClient, который будет опрашиваться интеграционными тестами.
var webHostBuilder = new WebHostBuilder()
.UseEnvironment("Testing")
.UseStartup<Startup>()
.ConfigureTestServices(s =>
{
addServices?.Invoke(s);
})
.ConfigureAppConfiguration((builderContext, config) =>
{
Configuration = config.AddJsonFile("appsettings.json", optional: false, reloadOnChange: true).AddEnvironmentVariables().Build();
this.SignatureCertificate = CertificateHelper.FindCertificateByThumbprint(Configuration.GetValue<string>("Certificates:SignatureThumbprint"), StoreLocation.LocalMachine, StoreName.My);
this.EncryptionCertificate = CertificateHelper.FindCertificateByThumbprint(Configuration.GetValue<string>("Certificates:EncryptionThumbprint"), StoreLocation.LocalMachine, StoreName.My);
this.DecryptionCertificate = CertificateHelper.FindCertificateByThumbprint(Configuration.GetValue<string>("Certificates:DecryptionThumbprint"), StoreLocation.LocalMachine, StoreName.My);
this.ReadSignedCertificate = CertificateHelper.FindCertificateByThumbprint(Configuration.GetValue<string>("Certificates:ReadSignedThumbprint"), StoreLocation.LocalMachine, StoreName.My);
});
var testServer = new TestServer(webHostBuilder);
this.Context = testServer.Host.Services.GetService(typeof(CrmContext)) as CrmContext;
this.Client = testServer.CreateClient();
Но теперь наши интеграционные тесты должны сначала запросить токен из конечной точки токена. Но конечная точка не была запущена webHostBuilder, потому что наша интеграция с ID4 находится в отдельной службе.
Нужно ли нам создавать второй TestServer из второго WebHostBuilder, который использует запуск службы аутентификации ASP.NET Core?
Любая помощь приветствуется.