2017-05-22 1 views
1

로드 밸런서 뒤에 IdentityServer와 관련된 문제가 있습니다.
직접 ips를 사용하고 있다면 분명히 everEthing이 예상대로 작동합니다.로드 밸런서 "토큰 엔드 포인트에 대한 HTTP 요청이 잘못되었습니다."

현재 2 대의 Linux 컴퓨터에서 호스팅되는 HTTP 도커 엔진으로 리디렉션되는 유효한 인증서가있는 LB에 SSL 구성이 있습니다.

나는 내 클라이언트에 MVC 하이브리드 흐름을 사용하고 있습니다 : 서버 측에

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" } 
}); 

을, 나는 다음과 같은 설정이 있습니다

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(); 
} 

이미 언급 한 바와 같이를, 그것은 구성 작동 로드 밸런서없이 클라이언트가 오류 "오류 메시지 : 'invalid_request', error_description : 'error_description is null', error_uri : 'error_uri is null'."

그리고

는 서버 측에서 내가 정보를 수신하고 있습니다 : IdentityServer4.Hosting.IdentityServerMiddleware [0] 호출하기 IdentityServer 엔드 포인트 : IdentityServer4.Endpoints.TokenEndpoint/토큰 연결/대한 경고 : IdentityServer4.Endpoints.TokenEndpoint [0] 토큰 엔드 포인트에 대한 유효하지 않은 HTTP 요청

+0

당신이 (HTTPS를 [앞으로 헤더] 가능 했 : //docs.microsoft.com/en-us/aspnet/core/publishing/linuxproduction#configure-a-reverse-proxy-server)? SSL 프록시에서 종료되고 있다면 앞으로 무슨 뜻 헤더를 사용하여 – Tseng

+0

을 (JWT 토큰은 HTTP를 통해 안전하지 않기 때문에) 신원/WebApi는 대부분의 경우에 SSL을 필요로 'app.UseForwardedHeaders (새 ForwardedHeadersOptions { ForwardedHeaders의 =의 ForwardedHeaders .XForwardedFor | ForwardedHeaders.XForwardedProto }); ' 그렇다 – Artem

답변

0

문제점을 해결했습니다. 해당 솔루션이 Request.HttpContext.Connection.RemoteIpAddress 을 추적했는데 유효하지 않으며로드 균형 조정기의 IP와 같았습니다. 따라서 솔루션은 다음을 사용하여 IP를 추가하는 것이 었습니다.

options.KnownProxies.Clear(); 
options.KnownProxies.Add(IPAddress.Parse("LoadBalancer IP")); 
app.UseForwardedHeaders(options); 

또는 마스크 (예. 192.168.1.0/8 :

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

클라이언트의 IP가 신원 서버에 전달 될 것이며 예외받을 수 없습니다 :

Invalid HTTP request for token endpoint 
관련 문제