我正在尝试使用dotnet-testcontainers library 将 keycloak 作为 testcontainer 添加到我的 .net core (5) 集成测试中。
我的问题是,我正在为 HTTPS 支持而苦苦挣扎,因为我的集成测试使用自签名证书和TestServer -Class 的容器。
准确地说,我正在使用 Microsoft 的 TestServer 类来创建具有内存配置的真实 API 请求,以使用具有暴露端口 8443 及其自签名证书的 keycloak-testcontainer。
问题是:我无法将 a 添加HttpClientHandler
到 TestServers HttpClient(created via serverCreateClient()
) 以允许此处理程序中的不受信任的证书。我在分支 apitests-https 上创建了一个具体示例。失败的测试可以在这里找到,它在SucceedsWhenGetRequestWithTokenReturnsListOfArticles
测试方法中。我在课程和 DemoApi 的 Startup.cs 中添加了一些注释 - 显示我尝试过的项目。
结果,TestServers 内部 Jwt 中间件使用默认的 HttpClient 并抛出以下 AuthenticationException:
---> System.IO.IOException: IDX20804: Unable to retrieve document from: 'System.String'.
---> System.Net.Http.HttpRequestException: The SSL connection could not be established, see inner exception.
---> System.Security.Authentication.AuthenticationException: The remote certificate is invalid according to the validation procedure: RemoteCertificateNameMismatch, RemoteCertificateChainErrors
at System.Net.Security.SslStream.SendAuthResetSignal(ProtocolToken message, ExceptionDispatchInfo exception)
at System.Net.Security.SslStream.ForceAuthenticationAsync[TIOAdapter](TIOAdapter adapter, Boolean receiveFirst, Byte[] reAuthenticationData, Boolean isApm)
at System.Net.Http.ConnectHelper.EstablishSslConnectionAsyncCore(Boolean async, Stream stream, SslClientAuthenticationOptions sslOptions, CancellationToken cancellationToken)
--- End of inner exception stack trace ---
我已经尝试了多种方法来使其工作,这些都在代码中进行了注释。
DemoApi/Startup.cs
:尝试使用以下代码添加我自己的“测试”环境:ServicePointManager.Expect100Continue = true; ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls | 安全协议类型.Tls11 | 安全协议类型.Tls12; ServicePointManager.ServerCertificateValidationCallback += (sender, certificate, chain, sslPolicyErrors) => true;
UseEnvironment("Testing")
在 Api 测试中创建 TestServer-Instance 时使用它。调试显示代码被调用,但仍然发生异常。
DemoApiTestsApi/BaseFixture.cs
或DemoApiTests/Infrastructure/Persistence/KeycloakTest.cs
:请参阅此处了解我自己的 HttpClient 的工作实现,它带有处理程序以获取一般的令牌(这在分支中有效) -GetTestToken
是 BaseFixture 中的方法。
所以,老实说,我对如何使用 TestServer 或其他方式进行这项工作有点想法。本质上,我需要在BaseFixture.GetTestToken()
/KeycloakTest.cs
中使用的处理程序也可以在我的 TestServer 实例中使用,但不能将其应用于CreateClient()
不接受参数的情况。非常感谢任何帮助,可能是解决方案或提示以另一种方式解决此问题。当有另一种解决方法时,TestServer 不一定是固定的。