Http error 400 the size of the request headers is too long iis

I'm currently working on an ASP.NET MVC website and it works fine. But I have a problem that I don't understand at all... When I launch my website on Visual Studio with Chrome for example no prob...

I’m currently working on an ASP.NET MVC website and it works fine.

But I have a problem that I don’t understand at all… When I launch my website on Visual Studio with Chrome for example no problem, but when I stop it and try to launch an other test with Firefox for example, my url is growing and then I get this error :

HTTP 400. The size of the request headers is too long.

Can someone explain me why this is happening ? Is it something with my code or does it come from IIS express or anything else ?

Thanks in advance

asked May 9, 2016 at 9:39

MrPixel6's user avatar

6

You can probably increase the size of requests your webserver will allow. However, take a look at the amount and the size of cookies your browser are sending to the server. Clear your cookies and try again, and see if you can reduce the size and amount of cookies your app is using. The less, the better! Mobile browsers can get these errors, as they don’t allow the same size as do desktop browsers(?).

The error can also mean the query string is getting too large.

answered Jul 4, 2016 at 12:41

cederlof's user avatar

cederlofcederlof

7,0764 gold badges44 silver badges62 bronze badges

.NET MVC SOLUTION FOR ME
In my case, it was my claims that was multiplying my session cookies to look as below in my browser cookies:

.AspNet.ApplicationCookie
.AspNet.ApplicationCookieC1
.AspNet.ApplicationCookieC2
.AspNet.ApplicationCookieC3
.AspNet.ApplicationCookieC4
.AspNet.ApplicationCookieC5
.AspNet.ApplicationCookieC6
.AspNet.ApplicationCookieC7
__RequestVerificationToken

I simply went to aspNetUserClaims table in my mssql management studio and cleared it. Then cleared the browser cookie for the project.

Refreshed the page. Kalas!!! Done!!
I believe it happened because I was switching from one database connectionstring to another which caused the claimsManager to recreate session and add to my cookie. On saturation, everyting exploded.

answered Jan 7, 2019 at 17:23

Ifeanyi Chukwu's user avatar

Ifeanyi ChukwuIfeanyi Chukwu

3,0693 gold badges27 silver badges30 bronze badges

Check the MSDN:

Cause

This issue may occur when the user is a member of many Active
Directory user groups. When a user is a member of a large number of
active directory groups the Kerberos authentication token for the user
increases in size. The HTTP request that the user sends to the IIS
server contains the Kerberos token in the WWW-Authenticate header, and
the header size increases as the number of groups goes up. If the
HTTP header or packet size increases past the limits configured in
IIS, IIS may reject the request and send this error as the response.

Resolution

To work around this problem, choose one of the following options:

A) Decrease the number of Active Directory groups that the user is a
member of.

OR

B) Modify the MaxFieldLength and the MaxRequestBytes registry settings
on the IIS server so the user’s request headers are not considered too
long. To determine the appropriate settings for the MaxFieldLength
and the MaxRequestBytes registry entries, use the following
calculations:

  1. Calculate the size of the user’s Kerberos token using the formula described in the following article:

    New resolution for problems with Kerberos authentication when users belong to many groups
    http://support.microsoft.com/kb/327825

  2. Configure the MaxFieldLength and the MaxRequestBytes registry keys on the IIS server with a value of 4/3 * T, where T is the user’s token
    size, in bytes. HTTP encodes the Kerberos token using base64 encoding
    and therefore replaces every 3 bytes in the token with 4 base64
    encoded bytes. Changes that are made to the registry will not take
    effect until you restart the HTTP service. Additionally, you may have
    to restart any related IIS services.

answered May 9, 2016 at 9:45

Rahul Tripathi's user avatar

Rahul TripathiRahul Tripathi

166k31 gold badges272 silver badges328 bronze badges

5

try this

<system.web>
        <httpRuntime maxRequestLength="2097151" executionTimeout="2097151" />
</system.web>

The maxRequestLength default size is 4096 KB (4 MB).

if browser request some resource again and again , at some time request header value length increase by number of times so we may try to extend request length to max length.
i hope this may usefull

Michael Freidgeim's user avatar

answered Jul 4, 2016 at 12:54

Sanjay Radadiya's user avatar

5

In windows system generally this error occurs due to the default header size limits set in the http.sys service. This service acts as a protective layer before requests are forwarded to the application to prevent it from being overwhelmed by invalid requests.

You can override the default max header limit by modifying the windows registry.

Follow the steps :

  • Run regedit
  • From the address bar go to the address : ComputerHKEY_LOCAL_MACHINESYSTEMCurrentControlSetServicesHTTPParameters or drill down manually.
  • Right click on «Parameters» > New > DWORD
  • Rename the new entry to MaxFieldLength
  • Right click the newly created MaxFieldLength, modify it and set the value to desired max individual header size in bytes, make sure base is set to decimal.
  • Do the same for MaxRequestBytes. Make it sufficiently higher to match value set in MaxFieldLength.
  • Open command prompt as administrator
  • Enter the command «net stop http» (make sure visual studio or other interfering programs are closed)
  • Enter the command «net start http»

Resources:

  • Enabling logging
  • Supported parameters

answered Nov 23, 2021 at 5:26

chaosifier's user avatar

chaosifierchaosifier

2,54622 silver badges37 bronze badges

2

In my case, I had cookies from a number of different apps served on my localhost with large cookies. FF differentiates by host-name so clearing my cookies from localhost fixed it.

answered Aug 14, 2020 at 0:05

ataboo's user avatar

atabooataboo

7671 gold badge8 silver badges15 bronze badges

Following Ifeanyi Chukwu’s answer, for my case, I tried with private mode (Incognito) and it works fine. Then I go to browser settings and delete cookies of my site (localhost). That fixes the issue.

answered Sep 7, 2022 at 15:15

Anh Bui's user avatar

As you may already figured out issue, a simple temporary solution would be to switch your browser while debugging.

answered Jan 20 at 5:46

Pavan S's user avatar

1

We need to send get request with more than 16181 chars .
The most we can sent at this time is: 15,861
After that we get:

HTTP Error 400. The size of the request headers is too long.

This is what configured in registry as a DWORD value:

MaxFieldLength: 65534 
MaxRequestBytes: 16777216 
UrlSegmentMaxLength: 32766

And in IIS:

maximum allowed content length 2147483647
maximum url length 2147483647
maximum url length 2147483647

web config:

  <requestFiltering>
    <requestLimits maxAllowedContentLength="2147483647" maxUrl="2147483647" maxQueryString="2147483647" />
  </requestFiltering>

<bindings>
  <netTcpBinding>
    <binding name="largeTcpBinding" maxBufferPoolSize="2147483647" maxBufferSize="2147483647" maxConnections="2147483647" maxReceivedMessageSize="2147483647" portSharingEnabled="false" transactionFlow="false" listenBacklog="2147483647">
      <security mode="None">
        <message clientCredentialType="None" />
        <transport protectionLevel="None" clientCredentialType="None" />
      </security>
      <reliableSession enabled="false" />
    </binding>
  </netTcpBinding>
  <webHttpBinding>
    <binding name="largeRestFullBinding" maxBufferPoolSize="2147483647" maxReceivedMessageSize="2147483647" maxBufferSize="2147483647" transferMode="Streamed">
      <readerQuotas maxDepth="2147483647" maxStringContentLength="2147483647" maxArrayLength="2147483647" maxBytesPerRead="2147483647" maxNameTableCharCount="2147483647" />
    </binding>
    <binding name="largeRestFullBindingSecoundEndPoint" maxBufferPoolSize="2147483647" maxReceivedMessageSize="2147483647" maxBufferSize="2147483647" transferMode="Streamed">
      <readerQuotas maxDepth="2147483647" maxStringContentLength="2147483647" maxArrayLength="2147483647" maxBytesPerRead="2147483647" maxNameTableCharCount="2147483647" />
    </binding>
  </webHttpBinding>
  <wsHttpBinding>
    <binding name="largeSoapBinding" maxBufferPoolSize="2147483647" maxReceivedMessageSize="2147483647">
      <readerQuotas maxDepth="2147483647" maxStringContentLength="2147483647" maxArrayLength="2147483647" maxBytesPerRead="2147483647" maxNameTableCharCount="2147483647" />
    </binding>
  </wsHttpBinding>
  <mexHttpBinding>
    <binding name="mexHttpBinding" />
  </mexHttpBinding>
</bindings>

  <system.web>
    <compilation debug="true" targetFramework="4.6" />
    <httpRuntime maxQueryStringLength="999999" maxUrlLength="999999" relaxedUrlToFileSystemMapping="true" targetFramework="4.6" />
    <machineKey decryptionKey="" validationKey="" />
  </system.web>

In HTTPERR I get:

2020-02-17 17:31:01 172.16.144.50 59371 172.16.144.50 80 HTTP/1.1 GET LONGURL- 400 - RequestLength -

The log cuts part of the url.

What am I missing?

На днях столкнулся с довольно интересной проблемой у некоторых пользователей, заключающейся в невозможности аутентифицироваться на ряде доменных сервисов из-за превышения максимального размера билета (токена) Kerberos. В этой статье мы покажем, как определить размер билета Kerberos для конкретного пользователя и увеличить буфер для хранения токена с помощью параметра MaxTokenSize.

В нашем кейсе проблема проявлялась следующим образом. Некоторые пользователи не могли получить доступ к ряду развернутых служб.

  • В частности, наблюдались проблема при попытке подключения к RDS ферме (ошибка “Access denied”)Remote Desktop Services - Access is deniedВ логах серверов Remote Desktop фиксировалась ошибка:

    Event ID:
    6

    Source:
    Microsoft-Windows-Security-Kerberos

    The kerberos SSPI package generated an output token of size 22041 bytes, which was too large to fit in the token buffer of size 12000 bytes, provided by process id 4.
    The output SSPI token being too large is probably the result of the user [email protected]  being a member of a large number of groups.
    It is recommended to minimize the number of groups a user belongs to. If the problem can not be corrected by reduction of the group memberships of this user, please contact your system administrator to increase the maximum token size, which in term is configured machine-wide via the following registry value: HKLMSYSTEMCurrentControlSetControlLsaKerberosParametersMaxTokenSize.
  • При попытке подключении к SQL Server, наблюдалась такая ошибка:
    Неизвестная ошибка, связанная с базой данных.
    SQL State: HY000, SQL Error Code:0
    Cannot generate SSPI context. Обратитесь к администратору системы.

    Cannot generate SSPI context

  • На сайтах IIS появлялись ошибки:
    Bad Request – Request header too long
    HTTP Error 400. The size of the request headers is too long.
  • В журналах Event Viewer появлялись события:
    Event ID:
    40960

    Source:
    LSA (LsaSrv)

    The Security System detected an authentication error for the server XXXXXX. The failure code from authentication protocol Kerberos was “{Buffer Too Small}
    The buffer is too small to contain the entry. No information has been written to the buffer.(0xc0000023).
  • К пользователю не применялись групповые политики.

При анализе проблемы вы заметили, что все проблемные пользователи состояли в большом количестве групп безопасности Active Directory (более 200 с учетом вложенных групп). Вместе с ошибками
SSPI token too large
это однозначно говорит о превышении максимальной длины билета Kerberos, используемого для аутентификации пользователей.

Содержание:

  • Размер билета Kerberos в Active Directory
  • Ограничение на максимальное количество групп пользователя в Active Directory
  • Как узнать текущий размер билета Kerberos пользователя?
  • Как увеличить размер буфера MaxTokenSize для Kerberos?
  • Размер токена Kerberos и ошибка IIS HTTP 400 Bad Request (Request header too long)

Размер билета Kerberos в Active Directory

Размер билета Kerberos зависит от следующих факторов:

  • Количества групп безопасности Active Directory (в том числе вложенных) в которых состоит пользователь (группы рассылок типа Mail-enabled universal distribution group в токен не включаются);
  • Используется ли SIDHistory;

    Примечание. Проблема с превышением максимального размера билета особо часто встречается при миграции пользователей между доменами Active Directory, когда вам нужно сохраненить доступ к ресурсам старого домена через механизм SIDHistory.

  • Используемого механизма аутентификации (обычный парольный или мультифакторный, например, через смарт карты)
  • Доверена ли учетная запись для делегирования или нет.

Kerberos использует буфер для хранения авторизационной информации и передает его размер приложениям, использующих Kerberos. Размер буфера определяется системным параметром MaxTokenSize. Размер буфера имеет значение, т.к. некоторые протоколы, такие как RPC и HTTP, используют его при выделении блока памяти для аутентификации. Если авторизационные данные пользователя, пытающегося аутентифицироваться, превышают размер MaxTokenSize, попытка аутентификация считается неудачной. Этим можно объяснить ошибки аутентификации при доступе к IIS, в то время как файловый доступ к сетевым ресурсам сохраняется.

По-умолчанию, размер токена Kerberos (MaxTokenSize):

  • В Windows 7 и Windows Server 2008R2 – 12 Кб.
  • В Windows 8 и Windows Server 2012 (вплоть до Windows Server 2022 и Windows 11) размер увеличен до 48 Кб.

Таким образом, если пользователь состоит в большом количестве группах, которые не помещаются в размер буфера токена MaxTokenSize, то при доступе к некоторых ресурсам происходит сбой проверки подлинности.

Ограничение на максимальное количество групп пользователя в Active Directory

В Active Directory есть жесткий лимит на количество групп, в которых может состоять пользователь. Лимит составляет 1015 групп (включая вложенные группы). При превышении количества групп пот входе пользователя в систему появляется ошибка:

The system cannot log you on due to the following error: During a logon attempt, the user’s security context accumulated too many security IDs. Please try again or consult your system administrator.

Если вы добавите пользователя более чем в 1015 групп, то он не сможет войти в Windows с ошибкой:

During a logon attempt, the user’s security context accumulated too many security IDs.

ошибка входа в windows: During a logon attempt, the user’s security context accumulated too many security IDs
В журнале событий при этом появится запись:

Source:
LSA (LsaSrv)

EventID:
6035

During a logon attempt, the user’s security context accumulated too many security IDs. This is a very unusual situation. Remove the user from some global or local groups to reduce the number of security IDs to incorporate into the security context.

Событие с eventid 6035 LSA (LsaSrv) пользователь состоит в слишком большом количестве групп безопасности

Вы можете узнать в скольких группах состоит пользователь с помощью командлета Get-ADUser из модуля AD PowerShell.

$user=Get-ADUser username
$token=(Get-ADUser $user -Properties tokengroups).tokengroups
$token.count

Как узнать текущий размер билета Kerberos пользователя?

В Windows нет удобных встроенных средств, позволяющих узнать размер токена Kerberos для конкретного пользователя. Для получения текущего размер билета Kerberos можно воспользоваться Powershell скриптом CheckMaxTokenSize.ps1 (изначально скрипт был написан Tim Springston и выложен на в Script Gallery на технет). Но сейчас скрипт там не доступен, поэтому я скопировал его в свой GitHub репозитарий (https://github.com/winadm/posh/blob/master/ActiveDirectory/CheckMaxTokenSize.ps1).

Скрипт позволяет получить текущий размер токена указанного пользователя, количество групп безопасности, в которых он включен, количество SID, хранящихся в SIDHistory пользователя, а также доверена ли учетная запись для делегирования или нет.

Скачайте скрипт и сохраните его в файл CheckMaxTokenSize.ps1. Разрешите запуск неподписанных скриптов политике выполнения PowerShell для текущей сессии:

Set-ExecutionPolicy RemoteSigned -Scope CurrentUser

Перейдите в каталог со скриптом:
Cd c:ps

Чтобы узнать размер токена пользователя user_name:

.CheckMaxTokenSize.ps1 -Principals 'user_name' -OSEmulation $true -Details $true

powershell скрипт CheckMaxTokenSize - проверить размер билета kerberos для пользователя

Скрипт просит указать для какого окружения следует вычислить размер билета пользователя. Есть три варианта в зависимости от используемых версий Windows.

1 — В Windows 7 / Windows Server 2008 R2 и более ранних (размер токена 12К)

4 — В Windows 8 / Windows Server 2012 и последующих ОС (размер токена 48K)

6 – Windows 10/Windows Server 2016 и выше

Если у вас в сети остались снятые с поддержки Windows Server 2008 R2 и Windows 7, нужно выбрать опцию
1
и нажать
Enter
. Через некоторое время (3-4 минуты) скрипт вернет следующую информацию:

Token Details for user user_name
**********************************
User's domain is CORP.
Total estimated token size is 22648.
For access to DCs and delegatable resources the total estimated token delegation size is 45296.
Effective MaxTokenSize value is: 12000
Problem detected. The token was too large for consistent authorization. Alter the maximum size per KB http://support.microsoft.com/kb/327825 and consider reducing direct and transitive group memberships.
*Token Details for user_name*
There are 957 groups in the token.
There are SIDs in the users SIDHistory.
There are 248 SIDs in the users groups SIDHistory attributes.
There are 248 total SIDHistories for user and groups user is a member of.
1188 are domain global scope security groups.
37 are domain local security groups.
68 are universal security groups inside of the users domain.
0 are universal security groups outside of the users domain.
Group Details included in output file at C:WindowstempTokenSizeDetails.txt
SIDHistory details included in output file at C:WindowstempTokenSizeDetails.txt

The token was too large for consistent authorization

В данном случае мы определили, что пользователь user_name состоит в 957 доменных группах безопасности, а размер его билета Kerberos — 22648, что почти в 2 раза больше, чем стандартный размер Kerberos Token Size в Windows 7 и Windows Server 2008 R.

Таким образом, чтобы решить проблему с аутентификацией, нужно либо уменьшить размер токена пользователя, либо увеличить размер буфера на всех системах, на которых наблюдается проблема с авторизацией Kerberos.

Вы можете уменьшить размер билета Kerberos пользователя за счет:

  • Уменьшения количества групп, в которых состоит пользователь;
  • Очистки атрибута SID History;
  • Отключения использования ограниченного делегирования Kerberos в атрибутах учетных записей (существенно сокращает размер токена).

Как увеличить размер буфера MaxTokenSize для Kerberos?

Вы можете увеличить максимальный размер буфера для токена Kerberos с помощью параметра реестра MaxTokenSize.

Microsoft не рекомендует устанавливать размер MaxTokenSize более 64Кб. Рекомендуется сначала увеличить лимит до 48Кб (лимит для Windows 8 / Windows Server 2012) и проверить работу сервисов. Чтобы увеличить размер буфера:

  1. Откройте редактор реестра и перейдите в раздел HKEY_LOCAL_MACHINESystemCurrentControlSetControlLsaKerberosParameters;
  2. Создайте новый параметр типа DWORD (32-bit) Value с именем MaxTokenSize;
  3. Укажите желаемое значение для максимального размер буфера (мы указали 48000 в десятичном форматер, т.к. размеры токена пользователей не превышают этого значения);задать размер MaxTokenSize в реестра для нового размера буфера kerberos
  4. Перезагрузите компьютер.

Эту операцию нужно выполнить на всех серверных системах, на которых наблюдается проблемы аутентификации.

Также вы можете задать максимальный MaxTokenSize с помощью параметра групповой политики Set maximum Kerberos SSPI context token buffer size. Находится она в разделе GPO Computer Configuration -> Policies -> Administrative Templates -> System -> Kerberos.

Set maximum Kerberos SSPI context token buffer size

С помощью политики Warning for large Kerberos tickets вы можете настроить вывод в системный лог предупреждений о превышении размера билета.

Предупреждение о билетах Kerberos большого размера

После применения новых параметров групповых политик, если Windows обнаруживает превышение порогового размера билета Kerberos, в журнале будут записываться события Event 31:

A ticket to the service ldap/DC Name/DomainName» is issued for account [email protected]». The size of the encrypted part of this ticket is 17421 bytes, which is close or greater than the configured ticket size threshold (12000 bytes). This ticket or any additional tickets issued from this ticket might result in authentication failures if the client or server application allocates SSPI token buffers bounded by a value that is close to the threshold value.

The size of ticket is largely determined by the size of authorization data it carries. The size of authorization data is determined by the groups the account is member of, the claims data the account is setup for, and the resource groups resolved in the resource domain.

Event 31

Размер токена Kerberos и ошибка IIS HTTP 400 Bad Request (Request header too long)

Еще одна проблема, связанная с превышением размера токена Kerberos, возникает на веб сайтах Internet Information Services (IIS) с Kerberos аутентификацией. При использовании Kerberos аутентификации в IIS, информация о членстве в группах безопасности пользователя хранится в заголовке
WWW-Authenticate
. Если пользователь состоит в большом количестве групп, размер такого заголовка может быть превышен и аутентфикация пользователя не произойдет.

IIS ошибка kerberos аутентфикации http error 400 bad request too long

Для решения этой проблемы нужно увеличить лимиты в следующих параметров реестра в ветке HKEY_LOCAL_MACHINESystemCurrentControlSetServicesHTTPParameters

  • MaxFieldLength – максимальный размер каждого заголовка (размер заголовка по-умолчани в IIS 16 Кб, максимальное значение 65536)
  • MaxRequestBytes – максимальный размер строки запроса и заголовков (максимальное значение 16777216)

Не рекомендуется сразу устанавливать максимальные значения для этих параметров реестра. При больших размерах заголовков производительности и безопасность веб сервера IIS сильно снижается.

Рекомендуется начать со значения 32 Кб (32000) для каждого из этих параметров. После внесения изменений нужно перезагрузить сервер IIS.

Если проблема не исчезнет, пробуйте понемногу повышать размер лимитов вплоть до 48000 байт.

Если вы установите для MaxFieldLength максимальное значение 64 Кб, нужно использовать значение 48 Кб для MaxTokenSize (
3/4*64 Кб
).

  • Remove From My Forums
  • Question

  • We have Exchange 2010 SP3 with CU4 and Exchange 2013 CU8.
    We switched the CAS from 2010 to 2013.
    Most users can succesfull connect to OWA and Outlook.
    Unfortunately some users get on OWA > http error 400 the size of the request headers is too long
    And when they start Outlook > server is not available

    I found this post >
    http://smtp4it.net/2013/12/05/exchange-2013-to-2007-outlook-anywhere-proxy-issue/ and some other technet artciles but they all mention Exchange 2003 or 2007.
    Also I read 1000+ groups we not have nearly that amount of groups.

    When i switch CAS back to 2010 user can succesfully open OWA.

    In exchange 2013 server in httper folder/log i see

    2015-06-03 08:30:08 10.212.119.31 31657 10.212.119.31 444 HTTP/1.1 RPC_IN_DATA /rpc/rpcproxy.dll?server1.contoso.com:6001 400 2 BadRequest MSExchangeRpcProxyAppPool

    Please any guidance

    • Edited by

      Wednesday, June 3, 2015 8:54 AM

Answers

  • Due to a blogpost we found we imported the regkeys and did iisreset.

    Reading this article that explains exactly our errors in logging it states a complete reboot is necessary

    https://support.microsoft.com/en-us/kb/2988444

    Will try this tonight

    • Proposed as answer by
      Sathish VeerapandianMVP
      Tuesday, June 9, 2015 3:04 PM
    • Marked as answer by
      dirkverhagen123
      Wednesday, June 10, 2015 12:19 PM

Понравилась статья? Поделить с друзьями:
  • Http error 400 the request hostname is invalid как исправить
  • Http error 400 the request hostname is invalid iis
  • Http error 400 the request has an invalid header name
  • Http error 400 python
  • Http error 400 a request header field is too long