Я размещаю базовое приложение asp. net ( admin ) за сервером IIS, настроенным в качестве обратного прокси-сервера. Приложение использует open id connect для аутентификации пользователей по отдельному приложению ( core ), которое использует Identity Server 4 (также размещенный за тем же обратным прокси-сервером). Оба приложения используют. NET Core 3.1. Обратный прокси-сервер сконфигурирован для пересылки запросов на http://192.168.0.161/admin
в приложение admin , которое размещено на том же компьютере под http://localhost:44321
. Это работает до тех пор, пока пользователь не попытается войти в систему. Пользователь правильно перенаправляется на страницу входа в приложения core , но это перенаправление содержит неверный URI перенаправления signin_oidc
для перенаправления обратно в приложение admin . URI перенаправления signin_oidc
всегда устанавливается на http://localhost:44321/signin-oidc
вместо http://192.168.0.161/admin/signin-oidc
.
Я уже искал по inte rnet, но каждое найденное мной решение подсказывает мне настроить ForwardedHeadersOptions
и вызывать app.UseForwardedHeaders()
перед app.UseAuthentication()
и все остальное должно обрабатываться автоматически. Но это не так.
Кажется, что приложение не учитывает эти заголовки.
Код для admin приложение:
Услуги запуска / настройки:
public void ConfigureServices(IServiceCollection services)
{
...
services.AddAuthentication(options =>
{
options.DefaultScheme = CookieAuthenticationDefaults.AuthenticationScheme;
options.DefaultChallengeScheme = "oidc";
})
.AddCookie(CookieAuthenticationDefaults.AuthenticationScheme)
.AddOpenIdConnect("oidc", options =>
{
options.Authority = openIdConnectAuthority;
options.ClientId = "mvc";
options.ClientSecret = "secret";
options.ResponseType = OidcConstants.ResponseTypes.Code;
options.SaveTokens = true;
options.GetClaimsFromUserInfoEndpoint = true;
options.RequireHttpsMetadata = false;
});
services.Configure<ForwardedHeadersOptions>(options =>
{
options.ForwardedHeaders = ForwardedHeaders.XForwardedHost | ForwardedHeaders.XForwardedFor | ForwardedHeaders.XForwardedProto;
options.KnownNetworks.Clear();
options.KnownProxies.Clear();
});
...
}
Запуск / настройка:
public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{
app.UseForwardedHeaders();
if (env.IsDevelopment())
{
app.UseDeveloperExceptionPage();
}
else
{
app.UseExceptionHandler("/Error");
}
app.UseStaticFiles();
app.UseRouting();
app.UseAuthentication();
app.UseAuthorization();
app.UseEndpoints(endpoints =>
{
endpoints.MapDefaultControllerRoute().RequireAuthorization();
endpoints.MapRazorPages();
});
}
Когда Я отлаживаю приложение. Это соответствующие заголовки запроса, которые отправляются в приложение:
{[X-Forwarded-Host, {192.168.0.161}]}
{[X-Forwarded-Proto, {http}]}
{[X-Original-URL, {/admin}]}
{[X-Forwarded-For, {192.168.0.161:51920}]}
Что я делаю не так? Как я могу сказать промежуточному программному обеспечению open id connect принять во внимание эти заголовки или, по крайней мере, жесткий код возврата signin_oidc
url? Поскольку установка CallbackPath
для oid c допускает только относительные URL-адреса, поэтому нет никаких шансов изменить базовый путь.
Edit
Я также пытался переопределить OnRedirectToIdentityProvider
событие в AddOpenIdConnect()
и установка URL-адреса возврата следующим образом:
options.Events.OnRedirectToIdentityProvider = ctx =>
{
ctx.ProtocolMessage.RedirectUri = "http://192.168.0.161/admin/signin-oidc";
return Task.CompletedTask;
};
Но это приведет к ошибке
Корреляция не удалась. Неизвестное местоположение.
исключение при перенаправлении.
Редактировать 2
Не удалось установить корреляцию
. Неизвестное местоположение. Исключение
исчезло, и я сознательно не сделал ничего другого. А это значит, что я буду go с этим решением на данный момент.