.NET Aspire测试项目使用Duende IdentityServer框架时的授权端口错误问题
.NET Aspire测试项目使用Duende IdentityServer框架时的授权端口错误问题
我之前也碰到过完全一样的问题,Aspire在测试环境下会自动给服务分配随机端口,根本不会用你在launchSettings里配置的固定端口,所以硬编码Authority地址肯定会导致连接被拒绝。给你几个实用的解决步骤:
动态获取IdentityServer服务的实际运行地址
不要在测试代码里写死Authority的URL,而是从Aspire的测试应用主机里直接获取服务的真实端点。Aspire的测试框架已经帮我们封装好了这个能力,你只需要在测试代码里通过服务名称来获取对应的Endpoint。修改你的测试方法,示例如下:
[Fact] public async Task GetAccessTokenValidScopeReturnsOKStatusCode() { // Arrange var appHost = await DistributedApplicationTestingBuilder.CreateAsync<Projects.AspireAppTest_AppHost>(); await using var app = await appHost.BuildAsync(); await app.StartAsync(); // 重点:动态获取IdentityServer服务的实际运行端点 // 这里的"IdentityServer"要替换成你在AppHost项目里注册服务时用的名称 var identityServerEndpoint = app.Services.GetRequiredService<EndpointReference>("IdentityServer"); var authorityUrl = identityServerEndpoint.HttpEndpoint.ToString(); // Act // 使用动态获取的authorityUrl来构造请求 var httpClient = new HttpClient(); // 先获取发现文档 var discoveryResponse = await httpClient.GetDiscoveryDocumentAsync(authorityUrl); if (discoveryResponse.IsError) { throw new InvalidOperationException($"获取发现文档失败: {discoveryResponse.Error}"); } // 请求Client Credentials令牌 var tokenResponse = await httpClient.RequestClientCredentialsTokenAsync(new ClientCredentialsTokenRequest { Address = discoveryResponse.TokenEndpoint, ClientId = "你的客户端ID", ClientSecret = "你的客户端密钥", Scope = "你的目标Scope" }); // 后续的断言逻辑... }确认服务名称匹配
一定要保证你在测试代码里使用的服务名称(比如上面的"IdentityServer")和你在AppHost项目里注册服务时的名称完全一致。比如如果你的AppHost里是这么注册的:var identityServer = builder.AddProject<Projects.MyIdentityServer>("identity-server");那测试代码里就要用"identity-server"来获取Endpoint,大小写要注意哦。
确保测试项目依赖正确
检查你的测试项目是否已经引用了Aspire的测试包Microsoft.AspNetCore.Aspire.Hosting.Testing,如果没有的话,先通过NuGet安装它,不然获取Endpoint的方法会用不了。
这个思路的核心就是利用Aspire测试框架提供的EndpointReference来动态获取服务的真实运行地址,完全避开端口不匹配的问题,毕竟Aspire在测试时的随机端口是为了避免环境冲突,我们顺着它的规则来就好啦。
备注:内容来源于stack exchange,提问作者Mårshåll
相关产品推荐
相关产品推荐

