WebApp за обратным прокси-сервером IIS устанавливает неправильный signin_oid c redirect_uri при аутентификации на внешнем IdentityServer через OIDC - PullRequest
0 голосов
/ 06 апреля 2020

Я размещаю базовое приложение 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 с этим решением на данный момент.

...