Docker Compose运行OpenIddict示例调用私有API报IDX20803错误如何解决?
故障原因
故障的核心是容器网络的寻址逻辑问题:
- 你当前API服务的OpenIddict/JWT验证配置中,OIDC元数据拉取地址填写的是
localhost:5000 - 当API运行在Docker容器内时,容器内的
localhost指向的是API容器本身,而非宿主机或其他服务容器,自然无法访问到OpenIddict授权服务,所以抛出Socket错误码99的地址无法分配异常 - 你把API放在宿主机运行时正常,是因为宿主机的
localhost可以直接访问到OpenIddict服务映射到宿主机的5000端口 - 公共接口正常是因为不需要走JWT校验逻辑,无需拉取OIDC配置,所以不受影响
解决方案
- 确认Docker Compose服务命名
首先确保你的docker-compose.yml中,OpenIddict授权服务有固定的服务名,同Docker Compose网桥下的所有容器,可直接通过服务名完成DNS解析互访,示例配置参考:
services: # 授权服务,服务名固定为auth-service auth-service: build: ./AuthServer ports: - "5000:5000" networks: - your-bridge-network # API服务 api: build: ./Api ports: - "5001:5001" networks: - your-bridge-network networks: your-bridge-network: driver: bridge
- 修改API的JWT/OpenIddict验证配置
需要配置两个参数兼容前后端不同的调用场景:
MetadataAddress:设置为容器内部访问授权服务的地址,格式为http://<授权服务名>:<容器内部端口>/.well-known/openid-configuration,比如http://auth-service:5000/.well-known/openid-configuration,用于API容器内部拉取OIDC配置ValidIssuer:设置为前端用户实际访问授权服务的地址,比如http://localhost:5000,和授权服务颁发Token时的issuer保持一致,用于验证Token合法性
ASP.NET Core示例配置:
builder.Services.AddAuthentication(options => { options.DefaultScheme = OpenIddictValidationAspNetCoreDefaults.AuthenticationScheme; }) .AddOpenIddictValidation(options => { options.MetadataAddress = "http://auth-service:5000/.well-known/openid-configuration"; options.ValidIssuer = "http://localhost:5000"; // 开发环境可禁用HTTPS校验,生产环境移除 options.DisableHttpsRequirement(); });
验证网络连通性
部署后可以进入API容器内部,执行命令验证授权服务是否可访问:curl http://auth-service:5000/.well-known/openid-configuration
如果能正常返回JSON格式的OIDC配置,说明网络配置已生效。额外检查项
确保授权服务的监听地址是0.0.0.0而非127.0.0.1,ASP.NET Core默认会监听0.0.0.0,如果手动修改了appsettings.json的Urls配置或Program.cs的监听逻辑,需要修正为监听所有网卡地址。
内容的提问来源于stack exchange,提问作者James Rhodes
相关产品推荐
相关产品推荐

