Search code examples
c#iisasp.net-corekestrel-http-server

IIS Deployed ASP.NET Core application giving intermittent 431 Request headers too long error


I am working on an ASP.NET Core application which consumes a GraphQL endpoint via RestSharp to retrieve the data. This is an intranet type application, deployed on a Windows 2016 IIS Server and we are utilizing Windows Authentication. The problem we are encountering is that a certain user, who belongs to a large number of active directory groups is getting intermittent 431 Request headers too long errors.

I have attempted the following:

  1. I am setting the IISDefaults in the startup.cs for both the application and service:

    services.AddAuthentication(IISDefaults.AuthenticationScheme);
    
  2. I am passing UseDefaultCredentials in the RestRequest

    var client = new RestClient(endpoint);
    var request = new RestRequest(Method.POST);
    request.UseDefaultCredentials = true;
    request.AddHeader("content-type", "application/json");
    request.AddParameter("application/json", data, ParameterType.RequestBody);
    IRestResponse response = client.Execute(request);
    return response.Content;
    
  3. Set the registry entries for MaxFieldLength and MaxRequestBytes to the max allowed.

Log from stdout:

info: Microsoft.AspNetCore.Server.Kestrel[17] Connection id "0HLIABLA41UKH" bad request data: "Request headers too long." Microsoft.AspNetCore.Server.Kestrel.Core.BadHttpRequestException: Request headers too long. at Microsoft.AspNetCore.Server.Kestrel.Core.BadHttpRequestException.Throw(RequestRejectionReason reason) at Microsoft.AspNetCore.Server.Kestrel.Core.Internal.Http.Http1Connection.TakeMessageHeaders(ReadOnlySequence1 buffer, SequencePosition& consumed, SequencePosition& examined) at Microsoft.AspNetCore.Server.Kestrel.Core.Internal.Http.Http1Connection.ParseRequest(ReadOnlySequence1 buffer, SequencePosition& consumed, SequencePosition& examined) at Microsoft.AspNetCore.Server.Kestrel.Core.Internal.Http.Http1Connection.TryParseRequest(ReadResult result, Boolean& endConnection) at Microsoft.AspNetCore.Server.Kestrel.Core.Internal.Http.HttpProtocol.ProcessRequests[TContext](IHttpApplication1 application) at Microsoft.AspNetCore.Server.Kestrel.Core.Internal.Http.HttpProtocol.ProcessRequestsAsync[TContext](IHttpApplication1 application) info: Microsoft.AspNetCore.Hosting.Internal.WebHost[1]


Solution

  • This was resolved by setting the MaxRequestHeadersTotalSize Kestrel option. This defaults to 32768.

            public static IWebHostBuilder CreateWebHostBuilder(string[] args) =>
                WebHost.CreateDefaultBuilder(args)
                       .UseStartup<Startup>()
                       .UseKestrel(options =>
                       {
                          options.Limits.MaxRequestHeadersTotalSize = 1048576;
                       });