2017-05-22 3 views
1

Ich habe ein Problem mit einem IdentityServer hinter einem Load Balancer,
Nur um klar zu sein, wenn ich direkte ips verwende, funktioniert alles wie erwartet.Load Balancer "Ungültige HTTP-Anforderung für Token-Endpunkt"

Derzeit habe ich eine SSL-Konfiguration auf LB mit einem gültigen Zertifikat, das zu einem HTTP-Docker-Engines leitet, die auf 2 Linux-Rechnern gehostet werden.

Ich bin mit einem MVC-Hybrid Flow auf meinem Auftraggeber:

app.UseOpenIdConnectAuthentication(new OpenIdConnectOptions 
{ 
    AuthenticationScheme = "oidc", 
    SignInScheme = "Cookies", 
    Authority = settings.Server, 
    RequireHttpsMetadata = "false", 
    ClientId = "MyMvcClient", 
    ClientSecret = "MyMvcSuperPassword", 
    ResponseType = "code id_token", 
    GetClaimsFromUserInfoEndpoint = true, 
    SaveTokens = true, 
    TokenValidationParameters = new TokenValidationParameters 
    { 
     NameClaimType = JwtClaimTypes.Name, 
     RoleClaimType = JwtClaimTypes.Role, 
    }, 
    Events = new OpenIdConnectEvents() 
    { 
     OnRemoteFailure = context => 
     { 
      context.Response.Redirect("/error"); 
      context.HandleResponse(); 
      return Task.FromResult(0); 
     } 
    }, 
    "Scope": { "openid", "profile", "email", "myclient", "offline_access" } 
}); 

Auf der Serverseite, ich habe folgendes Setup:

public void ConfigureServices(IServiceCollection services) 
{ 
    services.AddDbContext<IdentityDbContext>(builder); 
    services.AddIdentity<ApplicationUser, ApplicationRole>() 
     .AddEntityFrameworkStores<IdentityDbContext, Guid>() 
     .AddUserStore<UserStore<ApplicationUser, ApplicationRole, IdentityDbContext, Guid>>() 
     .AddRoleStore<RoleStore<ApplicationRole, IdentityDbContext, Guid>>() 
     .AddUserManager<LdapUserManager>() 
     .AddSignInManager<LdapSignInManager>() 
     .AddDefaultTokenProviders() 
     .AddIdentityServerUserClaimsPrincipalFactory(); 
    ... 
    string redisSettings = $"{redisHost}:{redisPort},ssl={redisSsl},abortConnect={redisAbortConnect},password={redisPassword}"; 
    services.AddDataProtection().PersistKeysToRedis(redis, redisKey); 
    ... 
    // Adds IdentityServer 
    services.AddIdentityServer() 
     .AddSigningCredential(new X509Certificate2("IdentityServerAuth.pfx")) 
     .AddConfigurationStore(builder) 
     .AddOperationalStore(builder) 
     .AddAspNetIdentity<ApplicationUser>() 
     .AddProfileService<IdentityProfileService>(); 
} 
public void Configure(IApplicationBuilder app, IHostingEnvironment env, ILoggerFactory loggerFactory, IServiceProvider serviceProvider) 
{ 
    app.UseIdentity(); 
    app.UseForwardedHeaders(new ForwardedHeadersOptions 
    { 
     ForwardedHeaders = ForwardedHeaders.XForwardedFor | ForwardedHeaders.XForwardedProto 
    }); 
    // Adds IdentityServer 
    app.UseIdentityServer(); 
} 

Wie ich bereits erwähnt, funktioniert es für die Konfiguration ohne Load Balancer, aber Client scheitert mit Fehler "Nachricht enthält Fehler: 'invalid_request', error_description: 'error_description is null', error_uri: 'error_uri is null'."

Und auf der Serverseite Ich erhalte info: IdentityServer4.Hosting.IdentityServerMiddleware [0] Hervorrufen IdentityServer Endpunkt: IdentityServer4.Endpoints.TokenEndpoint für/connect/Token warnen: IdentityServer4.Endpoints.TokenEndpoint [0] Ungültige HTTP-Anfrage für Token-Endpunkt

+0

Haben Sie [Vorwärts-Header] (https aktivieren: //docs.microsoft.com/en-us/aspnet/core/publishing/linuxproduction#configure-a-reverse-proxy-server)? SSL wird in den meisten Fällen vom Proxy beendet, und Identity/WebApi erfordert SSL (da JWT-Token nicht sicher über http sind) – Tseng

+0

Wenn Sie ForwardwaredHeaders = ForwardwardedHeaders = ForwardwardedHeaders = 0 ForwardedHeaders = ForwardedHeadersOptions 'app.UseForwardedHeaders (new ForwardedHeadersOptions) .XForwardedFor | ForwardedHeaders.XForwardedProto }); ' Dann Ja – Artem

Antwort

0

Ich habe das Problem gelöst. Die Lösung wurde gefunden und verfolgte die Request.HttpContext.Connection.RemoteIpAddress Sie war ungültig und entsprach der IP des Load Balancers. So bestand die Lösung darin, den Ip unter Verwendung von: oder durch eine Maske, z. 192.168.1.0/8:

options.KnownNetworks.Clear(); 
options.KnownNetworks.Add(new IPNetwork(IPAddress.Parse("192.168.1.0"), 8)); 
app.UseForwardedHeaders(options); 

In diesem Fall wird die IP-Adresse des Client wird auf Identity-Server übergeben werden, und Sie werden nicht Ausnahme erhalten:

Invalid HTTP request for token endpoint