IdentityServer4 - 在docker容器中运行时,TokenEndpoint始终为null

时间:2018-04-10 22:28:57

标签: .net docker asp.net-core-2.0 identityserver4

我在docker swarm容器中运行IdentityServer4(identity-service)。这是我的堆栈文件中的服务设置:

  identity-service:
    image: identity:${TAG:-latest}
    environment:
      - DATABASE_CONNECTION_STRING=mongodb://mongo:27017
      - ASPNETCORE_URLS=http://0.0.0.0:8080
      - LOGGING_LEVEL=1                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                          
    networks:
      - proxy
      - database
    deploy:
      replicas: 1
      update_config:
        parallelism: 1
        delay: 10s
        failure_action: rollback
        order: start-first
      labels:
        - com.df.notify=true
        - com.df.servicePath=${SERVICE_PATH:-/identity}
        - com.df.port=8080
    healthcheck:
      test: ["CMD", "curl", "-f", "localhost:8080/health"]
      interval: 5s
      timeout: 10s
      retries: 10
      start_period: 10s

我也在使用IdentityModel2.Client来请求令牌。这也是通过另一个端点identity-service/user/login中完成的:DiscoveryClient。这就是我使用 var discoveryDocument = await new DiscoveryClient(hostUrl).GetAsync(); if (discoveryDocument.IsError) { throw new Exception( String.Format("Failed to find discovery document at url: {0}, received following token-endpoint: {1}", hostUrl, discoveryDocument.TokenEndpoint)); } return new TokenClient(discoveryDocument.TokenEndpoint, "Web", authorizationSecret);

的方式
Exception

如果我不在容器中运行此功能,这样可以正常工作,但由于某种原因,因为discoveryDocument.TokenEndpoint null 而在群组中运行时会抛出http://0.0.0.0:8080/.well-known/openid-configuration。我还尝试将shell放入容器中,看看我是否可以使用curl访问hostUrl

(在容器中运行时http://0.0.0.0:80802018-04-10 16:18:50.678 ERROR 15716 --- [ restartedMain] com.zaxxer.hikari.HikariConfig : HikariPool-1 - dataSource or dataSourceClassName or jdbcUrl is required.

2 个答案:

答案 0 :(得分:0)

我通过不使用DiscoveryClient解决了这个问题。相反,我直接将TokenClient URL提供给token-endpoint,如下所示:

new TokenClient(String.Concat(hostUrl, "/connect/token"), "Web", authorizationSecret);

其中hostUrl由环境变量提供,并在我的docker-stack文件中设置为http://127.0.0.1。出于某种原因,这有效......

答案 1 :(得分:0)

在客户端上使用IdentityServer时,我遇到了同样的问题。 在启动中,缺少AddDeveloperSigningCredential,这导致了问题。