You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

.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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.16 10:39:35