Подтвердить что ты не робот

Слишком много файлов cookie OpenIdConnect.nonce вызывает страницу с ошибкой "Неверный запрос - слишком длинный запрос"

Я использую OWIN/OAuth с аутентификацией OpenId Connect (Microsoft.Owin.Security.OpenIdConnect) в веб-приложении С# ASP MVC. Вход в систему SSO с учетной записью Microsoft в основном работает, но время от времени я получаю страницу с ошибкой в ​​браузере, в которой говорится Bad Request - Request Too Long.

Я узнал, что эта ошибка вызвана слишком большим количеством файлов cookie. Удаление куки файлов помогает в течение некоторого времени, но через некоторое время проблема возвращается.

Файлы cookie, которые вызывают проблему, устанавливаются из фреймворка OpenId, поэтому существуют десятки файлов cookie с именами типа OpenIdConnect.nonce.9oEtF53WxOi2uAw........

Это не приложение SPA, но некоторые части периодически обновляются с помощью вызовов ajax.

4b9b3361

Ответ 1

Оказалось, что основной причиной был вызов Ajax.

Проблемный поток

1) Файл cookie OAuth истек через некоторое время

2) Истечение срока действия обычно перенаправляет страницу на login.microsoft.com, чтобы обновить файл cookie. На этом этапе OAuth framework добавляет новый nonce cookie к ответу (каждый раз)!

3) Но Ajax не обрабатывает перенаправления за пределами домена (кросс-домен до login.microsoft.com). Но файл cookie уже добавлен на страницу.

4) Следующий периодический вызов Ajax повторил поток, вызывающий быстрый рост файлов cookie 'nonce'.

Решение

Мне пришлось расширять код установки рамки OWIN OpenId для обработки вызовов Ajax по-разному - для предотвращения перенаправления и прекращения отправки файлов cookie.

public void ConfigureAuth(IAppBuilder app)
{
    app.SetDefaultSignInAsAuthenticationType(CookieAuthenticationDefaults.AuthenticationType);
    app.UseCookieAuthentication(new CookieAuthenticationOptions());

    app.UseOpenIdConnectAuthentication(
        new OpenIdConnectAuthenticationOptions
        {
            ClientId = clientId,
            Authority = authority,
            Notifications = new OpenIdConnectAuthenticationNotifications
            {
                RedirectToIdentityProvider = ctx => 
                {
                    bool isAjaxRequest = (ctx.Request.Headers != null && ctx.Request.Headers["X-Requested-With"] == "XMLHttpRequest");

                    if (isAjaxRequest)
                    {
                        ctx.Response.Headers.Remove("Set-Cookie");
                        ctx.State = NotificationResultState.HandledResponse;
                    }

                    return Task.FromResult(0);
                }
            }
        });
}

Вызывающий Ajax должен был быть скорректирован, чтобы обнаружить код 401 и выполнить полное обновление страницы (что вызвало быструю перенаправление полномочий Microsoft).

Ответ 2

В моем случае проблема заключалась в том, как я настраивал приложение внутри Startup.cs.

Напоминание для самостоятельной настройки сначала сначала выполните аутентификацию!

public class Startup
{
    public void Configuration(IAppBuilder app)
    {
        app.SetDefaultSignInAsAuthenticationType(CookieAuthenticationDefaults.AuthenticationType);
        app.UseCookieAuthentication(new CookieAuthenticationOptions());
        app.UseOpenIdConnectAuthentication(
            new OpenIdConnectAuthenticationOptions
            {
                ClientId = _clientId,
                ClientSecret = _clientSecret,
                Authority = _authority,
                RedirectUri = _redirectUri
            });

        // configure the rest of the application...
    }

Ответ 3

У меня аналогичная проблема с "Недопустимый запрос - слишком долго" в Chrome. Я видел, что это связано с куки файлами, и заметил, что когда я пытаюсь подключиться к приложению, я получаю около 39 файлов cookie из цикла. Я могу очистить все файлы cookie и попытаться подключиться снова. После первоначальной аутентификации логин просто завершается. Я могу войти в Azure AD, но когда он пытается вернуться к приложению, это то, где происходит цикл. Глядя на файлы cookie, они все OpenIDConnect.nonce.. Поиск имени cookie - это то, как я нашел этот пост. Я попробую то, что предложил Пеко в отношении startup.cs. Моя проблема не будет связана с истечением срока действия файлов cookie. Я видел много других с аналогичными проблемами в отношении Chrome/Azure AD OpenID. Просто хотел коснуться базы, для чего она стоит.

Печеньки, о которых идет речь, были найдены, щелкнув i/Lock в строке URL. Если я очищу файлы cookie login.microsoft.online, я могу вернуться для входа и повторить попытку. Я вхожу в систему успешно, выберите "Нет" или "Да", чтобы сохранить мой вход. THEN отправляет меня обратно в приложение, и он снова завершает работу, чтобы завершить работу на странице "Плохой запрос - запрос слишком долго" с другими 30-секундными файлами cookie для openid.connect

Дальнейшее исследование, но хотелось начать здесь тропу. Заглядывая вперед, основываясь на следующих подсказках Bad Request Too Long + Chrome + OpenID.Connect, приведу меня к следующему стеку. Я думаю, что проблема, с которой я столкнулся, заключается в том, что после входа в систему система все еще думает, что она ложна, похожая на то, что человек нашел в другом переполнении.

"User.Identity.IsAuthenticated ошибочен даже после успешного входа в систему".

ASP OpenID Connect: неверный запрос, запрос слишком длинный

Ответ 4

Для меня решением было обеспечить создание сеанса ASP.NET.

Действия по воспроизведению:

  • Удалить ASP.NET_SessionId cookie и idsrv cookie на защищенной странице вашего веб-приложения
  • Перезагрузить страницу
  • Перенаправить в хранилище аутентификации OIDC и пройти аутентификацию
  • Перенаправить обратно в webapp => проверка подлинности не удалась, потому что сеанс asp.net недоступен
  • Бесконечные перенаправления, пока не произойдет ошибка "Запрос слишком длинный..."

Решение: Принудительно создать сеанс, добавив

protected void Session_Start(object sender, EventArgs e)
{
}

на global.asax.cs.