CORB OpenID Подключение / подключение / авторизация конечной точки (Identity Server 4) - PullRequest
0 голосов
/ 23 января 2019

У меня сейчас странная проблема. Мы размещаем приложение ASP.CORE 2.1, которое использует Identity Server 4 в качестве шлюза объединения.

При первом переходе на сайт с использованием Chrome он пуст - в консоли остается лишь небольшой намек на то, что CORB что-то заблокировал.

enter image description here

Глядя в fiddler, кажется, что он блокирует «скрытую» форму, которая отправляет обратно приложениям / signin-oidc middleware.

Fiddler showing response from identity server

Но странно то, что при обновлении все работает, и CORB больше не является проблемой. Глядя на соответствующий «хороший» ответ в fiddler, одинаковые заголовки идентичны.

Я могу убедиться, что form_post с Identity Server не достигает приложения в fiddler, отлаживая события OpenID и каждый запрос, и я получаю nada.

app.Use(async (context, next) =>
        {
            if (!context.User.Identity.IsAuthenticated)
            {
                   // look to see if bearer is present instead of cookies
                    string auth = context.Request.Headers["Authorization"];
                    if (string.IsNullOrEmpty(auth) || !auth.StartsWith("Bearer ", StringComparison.OrdinalIgnoreCase))
                    {
                       // request needs to be authenticated
                        await context.ChallengeAsync();
                    }
                    else
                    {
                        await next();
                    }
            }
            else
            {
                // all is good, continue
                await next();
            }
        });

Почему CORB блокирует начальный запрос? Может ли это быть поведение в браузере по сравнению с обновлением?

Вот конфигурация клиента с отлаживаемыми событиями:

services.AddAuthentication(opts =>
            {
                opts.DefaultChallengeScheme = "oidce";
                opts.DefaultAuthenticateScheme = CookieAuthenticationDefaults.AuthenticationScheme;
            })
                .AddCookie(opts =>
                {
                    opts.SessionStore = new MemoryCacheTicketRepository();
                    opts.ExpireTimeSpan = TimeSpan.FromHours(2);
                })
                .AddIdentityServerAuthentication("Bearer", opts =>
                {
                    ...
                })
                .AddOpenIdConnect("oidce", opts =>
                {
                    ...
                    opts.Events = new Microsoft.AspNetCore.Authentication.OpenIdConnect.OpenIdConnectEvents()
                    {
                        OnAuthenticationFailed = async p =>
                        {
                            var test = p;
                        },
                        OnAuthorizationCodeReceived = async p =>
                        {
                            var test = p;
                        },
                        OnMessageReceived = async p =>
                        {
                            var test = p;
                        },
                        OnRemoteFailure = async p =>
                        {
                            var test = p;
                        },
                        OnTicketReceived = async p =>
                        {
                            var test = p;
                        },
                        OnTokenResponseReceived = async p =>
                        {
                            var test = p;
                        },
                        OnTokenValidated = async p =>
                        {
                            var test = p;
                        }

                    };
                });

Поскольку в хорошем или плохом ответе нет разницы в заголовках, я думаю, 'Access-Control-Allow-Headers' с 'Content-Type' не проблема. Что бы это могло быть?

1 Ответ

0 голосов
/ 25 января 2019

После комментариев Видмантаса Блажевичюса я попытался добавить заголовки CSPS, и это действительно сработало.

Небольшая ошибка, сначала я применил заголовки в приложении ASP CORE, которое обслуживает SPA.

app.Use(async (context, next) =>
{
    context.Response.Headers.Add("Content-Security-Policy",
                                "default-src 'self' https://localhost:5000; script-src 'unsafe-eval'; script-src-elem 'unsafe-inline';");
        if (!context.User.Identity.IsAuthenticated)
        {
                // look to see if bearer is present instead of cookies
            string auth = context.Request.Headers["Authorization"];
            if (string.IsNullOrEmpty(auth) || !auth.StartsWith("Bearer ", StringComparison.OrdinalIgnoreCase))
                {
                   // request needs to be authenticated
                    await context.ChallengeAsync();
                }
                else
                {
                    await next();
                }
        }
        else
        {
            // all is good, continue
            await next();
        }
    });

Похоже, это не сработало, поэтому я попытался добавить его в index.html, который обслуживало приложение.

<meta http-equiv="Content-Security-Policy" content="default-src 'self' https://localhost:5000; script-src 'unsafe-inline' 'unsafe-eval' 'self'; style-src 'self' 'unsafe-inline'; img-src 'self' data:;">

И до сих пор кажется, что оно действительно работает.

...