IdentityServer4: не удалось получить конфигурацию из: '{servicename} .well-known / openid-configuration'. проблема с докером - PullRequest
0 голосов
/ 18 апреля 2019

У меня есть identityserver4 контейнер (identitymanagement:5003/localhost:5003) и приложение MVC (website.com:5000/localhost:5000).

Как только оба запускаются в Docker, и я пытаюсь перейти к localhost:5000/home/login (для перенаправления на identityserver) я получаю ошибку

Невозможно получить конфигурацию из: 'https://identitymanagement:5003/.well-known/openid-configuration'.

Вот все мои разные части кода

MVC: входящий звонок

public IActionResult Login()
{
   return Challenge(new AuthenticationProperties
   {
       RedirectUri = "/Manage"
   });
}

MVC: Startup.cs

public static IServiceCollection AddCustomAuthentication(this IServiceCollection services, IConfiguration configuration)
    {

        var callBackUrl = configuration.GetValue<string>("logoutCallbackUrl");

        services.AddAuthentication(options =>
        {
            options.DefaultScheme = CookieAuthenticationDefaults.AuthenticationScheme;
            options.DefaultChallengeScheme = OpenIdConnectDefaults.AuthenticationScheme;
        })
        .AddCookie(x=>x.ExpireTimeSpan = TimeSpan.FromHours(2))
        .AddOpenIdConnect(options =>
        {
            options.SignInScheme = CookieAuthenticationDefaults.AuthenticationScheme;
            options.Authority = "https://identitymanagement:5003";
            options.SignedOutRedirectUri = callBackUrl.ToString();
            options.ClientId =  "website";
            options.ClientSecret = "secret";
            options.ResponseType = "code id_token";
            options.SaveTokens = true;
            options.GetClaimsFromUserInfoEndpoint = true;
            options.RequireHttpsMetadata = false;
            options.Scope.Add("openid");
            options.Scope.Add("profile");


        });

        return services;
    }
}

IdentityServer Startup.cs

public class Startup
{
    public Startup(IConfiguration configuration)
    {
        Configuration = configuration;
    }

    public IConfiguration Configuration { get; }

    // This method gets called by the runtime. Use this method to add services to the container.
    public void ConfigureServices(IServiceCollection services)
    {
        services.AddDbContext<ApplicationDbContext>(options =>
            options.UseSqlServer(Configuration.GetConnectionString("DefaultConnection")));


        services.AddIdentity<ApplicationUser, IdentityRole>()
            .AddDefaultUI(UIFramework.Bootstrap4)
            .AddEntityFrameworkStores<ApplicationDbContext>()
            .AddDefaultTokenProviders();


        services.AddIdentityServer()
            .AddDeveloperSigningCredential()
            .AddInMemoryIdentityResources(Config.GetIdentityResources())
            .AddInMemoryApiResources(Config.GetApiResources())
            .AddInMemoryClients(Config.GetClients())
            .AddAspNetIdentity<ApplicationUser>();

    }

    // This method gets called by the runtime. Use this method to configure the HTTP request pipeline.
    public void Configure(IApplicationBuilder app, IHostingEnvironment env)
    {
        if (env.IsDevelopment())
        {

            app.UseDeveloperExceptionPage();
            app.UseDatabaseErrorPage();
        }
        else
        {
            app.UseExceptionHandler("/Error");
        }

        app.UseStaticFiles();
        app.UseIdentityServer();
        app.UseMvcWithDefaultRoute();
    }

}

Identityserver: Config.cs

public class Config
{
    public static IEnumerable<ApiResource> GetApiResources()
    {
        return new List<ApiResource>
        {
            new ApiResource("resourceApi", "API Application")
        };
    }

    // scopes define the resources in your system
    public static IEnumerable<IdentityResource> GetIdentityResources()
    {
        return new List<IdentityResource>
        {
            new IdentityResources.OpenId(),
            new IdentityResources.Profile(),
            new IdentityResources.Email()
        };
    }

    public static IEnumerable<Client> GetClients()
    {
        return new List<Client>
        {


            // OpenID Connect implicit flow client (MVC)
            new Client
            {
                ClientId = "website",
                ClientName = "Public Website",
                AllowedGrantTypes = GrantTypes.Hybrid,
                RequireConsent = false,
                ClientSecrets =
                {
                    new Secret("secret".Sha256())
                },

                RedirectUris = { "https://kryptoevents.com:5000/signin-oidc" },
                PostLogoutRedirectUris = { "https://kryptoevents.com:5000/signout-callback-oidc" },
                AllowedScopes =
                {
                    IdentityServerConstants.StandardScopes.OpenId,
                    IdentityServerConstants.StandardScopes.Profile,
                    IdentityServerConstants.StandardScopes.Email,

                }
            }
        };
    }

}

докер-compose.override.yml

  identitymanagement:
    environment:
      - ASPNETCORE_ENVIRONMENT=Development
      - ASPNETCORE_URLS=https://+:443;http://+:80
      - ASPNETCORE_HTTPS_PORT=44378
    ports:
      - "60807:80"
      - "5003:443"

  website.com:
    environment:
      - ASPNETCORE_ENVIRONMENT=Development
      - ASPNETCORE_URLS=https://+:443;http://+:80
      - ASPNETCORE_HTTPS_PORT=44395
    ports:
      - "56530:80"
      - "5000:443"

Примечание Если я не запускаю сервисы в Docker, а просто запускаю их на IIS вместо options.Authority = "https://identitymanagement:5003"; изменив его на "https://localhost:5003", тогда все будет работать как положено.

Кажется, что внутри докера есть проблема, которую невозможно решить identitymanagment

Я также пытался использовать IP-адрес контейнера вместо identitymanagement, и я получаю ту же ошибку.

Нужно ли делать что-то особенное, когда дело касается сертификатов при работе внутри докера?

1 Ответ

0 голосов
/ 19 апреля 2019

возможно в вашем докере. Yml попробуйте изменить

  identitymanagement:
environment:
  - ASPNETCORE_ENVIRONMENT=Development
  - ASPNETCORE_URLS=https://+:443;http://+:80;https://+:5003
  - ASPNETCORE_HTTPS_PORT=5003
ports:
  - "60807:80"
  - "5003:5003"

  website.com:
environment:
  - ASPNETCORE_ENVIRONMENT=Development
  - ASPNETCORE_URLS=https://+:443;http://+:80;https://+:5000
  - ASPNETCORE_HTTPS_PORT=5000
ports:
  - "56530:80"
  - "5000:5000"

Потому что в ваших Identityserver Config.cs и MVC: Startup.cs вы настраиваете эти порты спецификаций

...