7

我正在编写一个测试以identity server4使用 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时出错:发送请求时出错。

我错过了什么?

4

1 回答 1

9

发现客户端显然正在对该实际地址进行外部调用。您希望它调用碰巧“活”在 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 集成测试。

于 2017-01-26T17:59:12.847 回答