Основной сайт asp.net за прокси-сервером: в результате входа Azure B2C корреляция не удалась - PullRequest
0 голосов
/ 05 февраля 2019

У меня есть веб-приложение, в котором используется вход Azure B2C. Когда я запускаю сайт локально, с настройкой, настроенной на вход в клиент Azure B2C, все работает должным образом.

Затем я развертываюсайт в Azure, где у меня есть два веб-приложения, расположенные за конфигурацией прокси / балансировки нагрузки FrontDoor.Я также попробовал то же самое с помощью диспетчера трафика.

Когда я нажимаю на ссылку «Войти», которая должна перенаправить меня на страницу входа в систему B2C, вместо этого я перенаправляюсь обратно на свой сайт и получаю сообщение об ошибкевеб-страница: Ошибка корреляции.

Предполагается, что у меня есть два веб-приложения в конфигурации входной двери, которые называются:

  • mywebapp-eastus
  • mywebapp-westus

и если предположить, что публичное имя домена равно https://www.mywebapp.com

, когда я выполняю вход требовать, в заголовках ответа на запрос signin-oidc я вижу это:

set-cookie: ARRAffinity=335ad67894a0a02a521f095924a8d7be4f7829a49d21743b7dd9ec8ce66879d7;Path=/;HttpOnly;Domain=mywebapp-eastus.azurewebsites.net

, где mywebapp-eastus фактически является отдельным именем веб-приложения.Я ожидал увидеть здесь общедоступный домен, а не отдельное веб-приложение, к которому я подключился.

Как видно из скриншота инструмента Chrome dev, signin-oidc приводит к ошибке после перенаправленияпроизошло:

requests

Я бы ожидал увидеть это вместо этого: ARRAffinity = 335ad67894a0a02a521f095924a8d7be4f7829a49d21743b7dd9ec8ce66879d7; Path = /; Httpmyb;;1034 *

Я не знаю, является ли это основной причиной ошибки.

Вот код, который устанавливает аутентификацию и куки:

            services.Configure<CookiePolicyOptions>(options =>
        {
            // This lambda determines whether user consent for non-essential cookies is needed for a given request.
            options.CheckConsentNeeded = context => true;
            options.MinimumSameSitePolicy = SameSiteMode.None;
        });

        services.Configure<ApiBehaviorOptions>(options =>
        {
            options.InvalidModelStateResponseFactory = ctx => new ValidationProblemDetailsResult();
        });

            services.AddAuthentication(sharedOptions =>
            {
                sharedOptions.DefaultAuthenticateScheme = CookieAuthenticationDefaults.AuthenticationScheme;
                sharedOptions.DefaultScheme = CookieAuthenticationDefaults.AuthenticationScheme;
                sharedOptions.DefaultChallengeScheme = OpenIdConnectDefaults.AuthenticationScheme;
            })
            .AddAzureAdB2C(options => Configuration.Bind(AppSettings.AzureB2CSettings, options))
            .AddCookie(CookieAuthenticationDefaults.AuthenticationScheme, options =>
            {
                options.ExpireTimeSpan = TimeSpan.FromMinutes(60);
                options.SlidingExpiration = true;
                options.Cookie.HttpOnly = false;
                options.Cookie.SecurePolicy = CookieSecurePolicy.SameAsRequest;
            });

Обновление

Я добавил опции x-forwarded-proto беззаметный эффект:

        var forwardingOptions = new ForwardedHeadersOptions()
        {
            ForwardedHeaders = ForwardedHeaders.XForwardedFor | ForwardedHeaders.XForwardedProto
        };
        forwardingOptions.KnownNetworks.Clear(); 
        forwardingOptions.KnownProxies.Clear();
        app.UseForwardedHeaders(forwardingOptions);

Я думал, что нашел здесь связанную проблему: x-forwarded-proto-not-working

Любая идея, как я могу решить эту проблемувопрос?Какие параметры можно настроить для правильного заполнения общедоступного домена в заголовках ответов.

Веб-приложение работает под управлением asp.netcore 2.2 в Linux (веб-приложение для контейнеров).

Обновление 2:

Я добавил логирование на сайт.Это показывает, что есть основная ошибка: Cookie не найден и Корреляция не удалась

Информация {Protocol = "HTTP / 1.1", Method = "POST", ContentType = "application / x-www-form-urlencoded", ContentLength = 722, Scheme = "http", Host = "webapp-eastus.azurewebsites.net", PathBase = "", Path = "/ signin-oidc", QueryString = "", EventId = {Id = 1}, SourceContext = "Microsoft.AspNetCore.Hosting.Internal.WebHost", RequestId = "0HLKC8D934664: 00000001", RequestPath = "/ signin-oidc", CorrelationId = null, ConnectionId= "0HLKC8D934664"} "Запрос на запуск HTTP / 1.1 POST http://webapp -eastus.azurewebsites.net / signin-oidc application / x-www-form-urlencoded 722" Debug {EventId = {Id = 1}, SourceContext = "Microsoft.AspNetCore.HttpsPolicy.HstsMiddleware", RequestId = "0HLKC8D934664: 00000001", RequestPath = "/ signin-oidc", CorrelationId = null, ConnectionId = "0HLKC8D934664" в запросе.}Пропуск заголовка HSTS.Debug {EventId = {Id = 1}, SourceContext = "Microsoft.AspNetCore.StaticFiles.StaticFileMiddleware", RequestId = "0HLKC8D934664: 00000001", RequestPath = "/ signin-oidc", CorrelationId = null, ConnectionId = "646 "0HPOST "запросы не поддерживаются Debug {EventId = {Id = 25, Name =" RequestBodyStart "}, SourceContext =" Microsoft.AspNetCore.Server.Kestrel ", RequestId =" 0HLKC8D934664: 00000001 ", RequestPath =" / signin-oidc ", CorrelationId = null} Идентификатор соединения "" 0HLKC8D934664 "", Идентификатор запроса "" 0HLKC8D934664: 00000001 "": начато чтение тела запроса.Debug {EventId = {Id = 26, Name = "RequestBodyDone"}, SourceContext = "Microsoft.AspNetCore.Server.Kestrel", RequestId = "0HLKC8D934664: 00000001", RequestPath = "/ signin-oidc", CorrelationId = null} Connectionid "" 0HLKC8D934664 "", идентификатор запроса "" 0HLKC8D934664: 00000001 "": тело запроса на чтение завершено.[40m [1m [33mwarn [39m [22m] [49m: Microsoft.AspNetCore.Authentication.OpenIdConnect.OpenIdConnectHandler [15]Файл cookie «.AspNetCore.Correlation.OpenIdConnect.2KB8HPHJV3KhB2HCDp3C3b5iPXjcdAQLOrz5-6nGnwY» не найден.Warning {EventId = {Id = 15}, SourceContext = "Microsoft.AspNetCore.Authentication.OpenIdConnect.OpenIdConnectHandler", RequestId = "0HLKC8D934664: 00000001", RequestPath = "/ signin-oidc", CorrelationId =C0 0HH Connection, Null, 0D0H0, 0H, Connection 0, 0HH, 0H0, 0H9} '".AspNetCore.Correlation.OpenIdConnect.2KB8HPHJV3KhB2HCDp3C3b5iPXjcdAQLOrz5-6nGnwY"' cookie не найдено .Information {EventId = {Id = 4}, SourceContext = "Microsoft.AspNetCore.Authentication.OpenIdConnect.OpenIdConnectHandler", RequestId = "0HLKC8D934664: 00000001", RequestPath = "/ signin-oidc", CorrelationId =64 0HH Connection, Null, 0D0H0, 0H, Connection, 0D0H0, 0HH, 0H9} Ошибка удаленной аутентификации: « Корреляция не удалась. ».Debug {SourceContext = "AppBuilderExtensions", RequestId = "0HLKC8D934663: 00000001", RequestPath = "/", CorrelationId = null, ConnectionId = "0HLKC8D934663"} Заголовок: «Пользователь-агент»: [«Edge Health Probe Source»] Debug= "AppBuilderExtensions", RequestId = "0HLKC8D934663: 00000001", RequestPath = "/", CorrelationId = null, ConnectionId = "0HLKC8D934663"} Заголовок: "X-Client-IP": ["1.1.1.1"] Information {ElapsedMill12.3269, StatusCode = 302, ContentType = null, EventId = {Id = 2}, SourceContext = "Microsoft.AspNetCore.Hosting.Internal.WebHost", RequestId = "0HLKC8D934664: 00000001", RequestPath = "/ signin-oidc", Correre= null, ConnectionId = "0HLKC8D934664"} "Запрос завершен в 12.3269ms 302" Debug {EventId = {Id = 6, Name = "ConnectionReadFin"}, SourceContext = "Microsoft.AspNetCore.Server.Kestrel.Transport.Sockets"} Соединениеid "" 0HLKC8D934664 "" получен FIN.Debug {EventId = {Id = 7, Name = "ConnectionWriteFin"}, SourceContext = "Microsoft.AspNetCore.Server.Kestrel.Transport.Sockets"} Идентификатор соединения "" 0HLKC8D934664 "" отправка FIN из-за: "" Клиент закрыл соединение. "" Debug {SourceContext = "AppBuilderExtensions", RequestId = "0HLKC8D934663: 00000001", RequestPath = "/", CorrelationId = null, ConnectionId = "0HLKC8D934663"} Заголовок: "X-Client-Port": ["63761]]Debug {SourceContext = "AppBuilderExtensions", RequestId = "0HLKC8D934663: 00000001", RequestPath = "/", CorrelationId = null, ConnectionId = "0HLKC8D934663"} Заголовок: "X-FD-HealthProbe": ["1" "Debug= "AppBuilderExtensions", RequestId = "0HLKC8D934663: 00000001", RequestPath = "/", CorrelationId = null, ConnectionId = "0HLKC8D934663"} Заголовок: "X-WAWS-Unencoded-URL": ["/"] Debug {"AppBuilderExtensions", RequestId = "0HLKC8D934663: 00000001", RequestPath = "/", CorrelationId = null, ConnectionId = "0HLKC8D934663"} Заголовок: "CLIENT-IP": ["1.1.1.1:63761"] Debug {SourceAppBuilderExtensions ", RequestId = "0HLKC8D934663: 00000001", RequestPath = "/", CorrelationId = null, ConnectionId = "0HLKC8D934663"} Заголовок: "X-ARR-LOG-ID": ["5022cb4d-7c63-4a78-ad11-c8474246 Deb8{SourceContext = "AppBuilderExtensions", RequestId = "0HLKC8D934663: 00000001", RequestPath = "/", CorrelationId = null, ConnectionId = "0HLKC8D934663"} Заголовок: "DISGUISED-HOST": ["webappureweets..netDebug {SourceContext = "AppBuilderExtensions", RequestId = "0HLKC8D934663: 00000001", RequestPath = "/", CorrelationId = null, ConnectionId = "0HLKC8D934663"} Заголовок: "X-SITE-DEPLOYMENT-ID": "[»] Debug {SourceContext = "AppBuilderExtensions", RequestId = "0HLKC8D934663: 00000001", RequestPath = "/", CorrelationId = null, ConnectionId = "0HLKC8D934663"} Заголовок: "WAS-DEFAULT-HOSTNuresites веб-сайты восток" ":.net "] Debug {SourceContext =" AppBuilderExtensions ", RequestId =" 0HLKC8D934663: 00000001 ", RequestPath =" / ", CorrelationId = null, ConnectionId =" 0HLKC8D934663 "} Заголовок:" X-Original-URL ": [" / "] Debug {EventId = {Id = 10, Name = "ConnectionDisconnect "}, SourceContext =" Microsoft.AspNetCore.Server.Kestrel "} Идентификатор соединения" "0HLKC8D934664" "отключается.Debug {EventId = {Id = 2, Name = "ConnectionStop"}, SourceContext = "Microsoft.AspNetCore.Server.Kestrel"} Идентификатор соединения "" 0HLKC8D934664 "" остановлен.

Просто чтобы прояснить ситуацию, я включил липкие сессии в конфигурации FrontDoor.Я также попытался остановить одно из веб-приложений во время входа в систему, чтобы увидеть, каков был эффект.Такое же поведениеПоэтому я не думаю, что это проблема, связанная с DataProtection .

Обновление 3

Я думаю, что, возможно, нашел основную проблему.Я обнаружил эту ошибку:

AADB2C90006: URI перенаправления 'https://webapp -eastus.azurewebsites.net / signin-oidc ', указанный в запросе, не зарегистрирован для клиентаid 'zzzzzzz-2121-4158-b0f8-9d164c95000'.Идентификатор корреляции: xxxxxxxxx-xxxxxxxxx-xxxxxxx-xxxxxxx

Когда я искал в запросе заголовки X-Forwarded *, я обнаружил, что они отсутствуют.Это даже при том, что у меня есть блок кода, который выглядит следующим образом:

            services.Configure<ForwardedHeadersOptions>(options =>
        {
            options.ForwardedHeaders =
                ForwardedHeaders.XForwardedFor | ForwardedHeaders.XForwardedProto;
        });

в ConfigureServices, в Startup.cs

В Configure () у меня есть это:

    public void Configure(IApplicationBuilder app)
    {
        app.UseForwardedHeaders();

        if (env.IsDevelopment())
        {
            app.UseDeveloperExceptionPage();
        }

        app.UseHttpsRedirection();
        app.UseStaticFiles();
        app.UseCookiePolicy();

        app.Use((context, next) =>
        {
            context.Request.Scheme = "https";
            return next();
        });

        app.UseSession();

        app.UseAuthentication();
        app.LogAuthenticationRequests(_loggerFactory);

        app.UseMvc(routes =>
        {
            routes.MapRoute(
                name: "default",
                template: "{controller=Home}/{action=Index}/{id?}");
        });
    }

Вопрос теперь в том, почему заголовки X-Forwarded- * будут отсутствовать в запросах?

...