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
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
Wenn Sie ForwardwaredHeaders = ForwardwardedHeaders = ForwardwardedHeaders = 0 ForwardedHeaders = ForwardedHeadersOptions 'app.UseForwardedHeaders (new ForwardedHeadersOptions) .XForwardedFor | ForwardedHeaders.XForwardedProto }); ' Dann Ja – Artem