ОШИБКА HTTP2_PROTOCOL_ERROR после завершения аутентификации

#itfoxtec-identity-saml2

#itfoxtec-identity-saml2

Вопрос:

Я пытаюсь использовать ITfoxtec.Identity.Saml2.MVC Core в веб-приложении .NET Core 3.1 с использованием внутреннего IdP.

Он отлично работает на нашем тестовом сервере (Windows Server 2012, размещенный в IIS), но я не могу заставить его работать на любом другом сервере.

Вот что происходит:

Первоначальный вызов на веб-сайт правильно идентифицируется как вызов, не прошедший проверку подлинности, и пользователь отправляется на IdP, где пользователь входит в систему как обычно. Затем SAML-токен отправляется обратно в службу потребителей утверждений веб-приложений, где все выглядит так, как будто он выполняет то, что должен, saml2AuthnResponse .Статус имеет statuscode Saml2StatusCodes.Успешно, и в файле журнала указано «Схема аутентификации: saml2 выполнен вход». Затем он считывает параметр returnUrl и регистрирует что-то вроде «Выполнение RedirectResult», но затем он просто останавливается. Ничего в файле журнала, ничего в IIS-logs. Пользователь получает сообщение

This site can’t be reached
...
ERR_HTTP2_PROTOCOL_ERROR

Короче говоря, каждый контроллер, у которого есть атрибут [Authorize], выдает ошибку ERR_HTTP2_PROTOCOL_ERROR-error. Когда я удаляю все атрибуты [Authorize], приложение отлично работает, хотя и без аутентификации.

Я также попробовал пример TestWebAppCore-приложения от ITfoxtec.Страница github Identity.Saml2 выдает ту же ошибку. Он работает на нашем тестовом сервере 2012 года, но нигде больше.

Есть идеи, которые я могу попробовать?

Ответ №1:

Я думаю, вам нужно отследить вызовы, чтобы увидеть фактический http-запрос и ответы, отправляемые между браузером и сервером. Я обычно использую Fiddler для отслеживания запросов / ответов. Не забудьте включить Fiddler для отслеживания https.

Моя первая мысль заключается в том, что проблема может быть как-то связана с файлами cookie. Но это только предположение…

Ответ №2:

Возможно, вы что-то поняли, мы отключили http / 2 на сервере и вместо этого получили это сообщение:

 Bad Request - Request Too Long
HTTP Error 400. The size of the request headers is too long.
  

Для SAML-данных используется 5 блоков cookie-файлов общим объемом 19941 байт, что слишком много. Я попытался заставить приложение сохранить данные сеанса в классических объектах сеанса, но, похоже, я не могу заставить его работать.

Это то, что я добавил в StartUp.cs:

В ConfigureService:

 services.AddMvc()
    .AddSessionStateTempDataProvider();

services.AddSession(options =>
    options.Cookie.IsEssential = true
);

services.Configure<CookiePolicyOptions>(options =>
{
    options.CheckConsentNeeded = context => false;
    options.MinimumSameSitePolicy = SameSiteMode.None;
});
  

В Configure:

 app.UseSession();
  

Но он все равно заполняет заголовок файлами cookie. Что я делаю не так? Есть ли другой способ уменьшить сеансовые файлы cookie?