IdentityServer4 Testserver не найден

Я пишу тест для получения токена от удостоверения сервера4 с использованием Microsoft.AspNetCore.TestHost

   var hostBuilder = new WebHostBuilder()
                    .ConfigureServices(services =>
                    {
                        services.AddIdentityServer()
                                .AddTemporarySigningCredential()
                                .AddInMemoryIdentityResources(Config.GetIdentityResources())
                                .AddInMemoryApiResources(Config.GetApiResources())
                                .AddInMemoryClients(Config.GetClients())
                                .AddTestUsers(Config.GetUsers())                           
                                ;

                    })
                    .Configure(app =>
                    {
                        app.UseIdentityServer();
                    });
                var server = new TestServer(hostBuilder);
                var client = server.CreateClient();
                client.BaseAddress = new Uri("http://localhost:5000");

                var disco = await DiscoveryClient.GetAsync("http://localhost:5000");

Затем disco.Error появляется следующая ошибка

Ошибка подключения к http://localhost:5001/.well-known/openid-configuration: при отправке запроса произошла ошибка.

Что мне не хватает?

1 ответ

Решение

Клиент обнаружения, очевидно, выполняет внешний вызов по этому фактическому адресу. Вы хотите, чтобы он вызывал тестовый сервер, который происходит с "живым" InMemory.

Взгляните на эти тесты здесь для IdentityServer4, который тестирует документ обнаружения.

Чтобы ответить на ваш вопрос, хотя вам нужно использовать один из перегруженных методов для DiscoveryClient это берет обработчик, который будет делать правильный "вызов" к вашему тестовому серверу InMemory. Ниже приведен пример того, как это можно сделать.

var server = new TestServer(hostBuilder);
var handler = server.CreateHandler();
var discoveryClient = new DiscoveryClient("http://localhost:5000", handler);
var discoveryDocument = await discoveryClient.GetAsync();

Также я настоятельно рекомендую пройти интеграционные тесты IdentityServer4, если вы собираетесь выполнять некоторые из ваших собственных тестов, подобных этой.

Другие вопросы по тегам