У меня есть веб-приложение, в котором используется вход 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 приводит к ошибке после перенаправленияпроизошло:
Я бы ожидал увидеть это вместо этого: 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- * будут отсутствовать в запросах?