Asp.net core 负载平衡器“;令牌终结点的HTTP请求无效;

Asp.net core 负载平衡器“;令牌终结点的HTTP请求无效;,asp.net-core,load-balancing,identityserver4,Asp.net Core,Load Balancing,Identityserver4,负载平衡器后面的IdentityServer有问题, 如果我使用的是直接IP,我想说清楚,一切都是按照预期进行的 目前我在LB上有一个SSL配置,带有一个有效的证书,可以重定向到托管在2台Linux机器上的HTTP docker引擎 我在我的客户机上使用MVC混合流: app.UseOpenIdConnectAuthentication(new OpenIdConnectOptions { AuthenticationScheme = "oidc", SignInScheme =

负载平衡器后面的IdentityServer有问题,
如果我使用的是直接IP,我想说清楚,一切都是按照预期进行的

目前我在LB上有一个SSL配置,带有一个有效的证书,可以重定向到托管在2台Linux机器上的HTTP docker引擎

我在我的客户机上使用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();
}
public void配置服务(IServiceCollection服务)
{
AddDbContext(builder);
服务.额外性()
.AddEntityFrameworkStores()
.AddUserStore()
.AddRoleStore()
.AddUserManager()
.AddSignInManager()的名称
.AddDefaultTokenProviders()
.AddIdentityServerUserClaimsPrincipalFactory();
...
字符串redisSettings=$“{redisHost}:{redisPort},ssl={redisSsl},abortConnect={redisAbortConnect},password={redisPassword}”;
services.AddDataProtection().PersistKeysRedis(redis,redisKey);
...
//添加IdentityServer
services.AddIdentityServer()
.AddSigningCredential(新的X509Certificate2(“IdentityServerAuth.pfx”))
.AddConfigurationStore(生成器)
.AddStore(建筑商)
.AddAsNetIdentity()
.AddProfileService();
}
public void Configure(IApplicationBuilder应用程序、IHostingEnvironment环境、iLogger工厂、IServiceProvider服务提供商)
{
app.UseIdentity();
app.UseForwardedHeaders(新ForwardedHeaders选项
{
ForwardedHeaders=ForwardedHeaders.XForwardedFor | ForwardedHeaders.XForwardedProto
});
//添加IdentityServer
app.UseIdentityServer();
}
正如我已经提到的,它可以在没有负载平衡器的情况下进行配置,但客户端会出错 消息包含错误:“无效的请求”,错误描述:“错误描述为null”,错误uri:“错误uri为null”

在服务器端,我收到 信息:IdentityServer4.Hosting.IdentityServerMiddleware[0] 调用/connect/token的IdentityServer端点:IdentityServer 4.Endpoints.TokenEndpoint 警告:IdentityServer4.Endpoints.TokenEndpoint[0]
令牌端点的HTTP请求无效

我已解决该问题。 在跟踪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将传递给Identity server,您不会收到异常:

Invalid HTTP request for token endpoint

你启用了吗?SSL在代理端终止,而Identity/WebApi在大多数情况下都需要SSL(因为JWT令牌在http上不安全),如果启用转发头,您的意思是
app.UseForwardedHeaders(新的ForwardedHeaders选项{ForwardedHeaders=ForwardedHeaders.XForwardedFor | ForwardedHeaders.XForwardedProto})然后是