ASP.NET CORE WebAPI в IIS случайным образом возвращает дубликаты заголовков CORS

#asp.net-core #iis #cors #asp.net-core-webapi

Вопрос:

У нас есть ASP.NET Ядро WebAPI 3.1 размещено в IIS 8.5 (Windows 2012 R2)с использованием модели хостинга inprocess. Мы не включили никаких настроек CORS в Web.config. Это делается через сам WebAPI. Но мы столкнулись с проблемой дублирования заголовка CORS на случайной основе. Иногда это работает, казалось бы, безрезультатно. Через день или два мы начинаем видеть два типа дубликатов. a) Учетные данные, разрешающие управление доступом, заполняются как true, true b) Или Учетные данные, разрешающие управление доступом, повторяются дважды.

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

Изначально мы думали, что это может быть связано с тем, что в web.config также есть запись CORS, и WebAPI также добавляет ее. Поэтому мы полностью удалили его из web.config, после чего он начал работать в течение дня. Затем на следующий день вернулся к тому же вопросу.

Пожалуйста, найдите web.config ниже

 <configuration>
  <location path="." inheritInChildApplications="false">
    <system.webServer>
      <modules runAllManagedModulesForAllRequests="false">
        <remove name="WebDAVModule" />
      </modules>
      <handlers>
        <remove name="WebDAV" />
        <add name="aspNetCore" path="*" verb="*" modules="AspNetCoreModuleV2" resourceType="Unspecified" />
      </handlers>
      <aspNetCore processPath="dotnet" arguments=".MyWebAPI.dll" stdoutLogEnabled="false" hostingModel="inprocess" />
    </system.webServer>
  </location>
</configuration>
 

Регистрация услуги имеет одну строку, связанную с Cors.

 services.AddCors();
 

Конфигурация промежуточного ПО использует следующий метод расширения, который совместно используется несколькими API. В зависимости от потребностей API они могут иметь различную конфигурацию CORS.

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

 {
  "CorsConfig": {
    "AllowedOrigins": "https://*.abcd.com,https://*.us.mno.com,https://*.somedomain.com,https://*.xyz.com"
  }
}
 

The extension method will look for availability of configuration in appsettings. When not available, it will have a default behavior.

 public static void UseCorsSetup(this IApplicationBuilder app, IConfiguration configuration)
        {
            if(configuration.HasCors())
            {
                app.UseCors(builder =>
               {
                   builder.WithOrigins(configuration.CorsOrigins()).SetIsOriginAllowedToAllowWildcardSubdomains().AllowCredentials();
                   Log.Information("Cors-Origins: {@Origins}", configuration.GetSection("CorsConfig:AllowedOrigins").Value);

                   if (configuration.UseAnyHeaders())
                   {
                       Log.Information("Cors-Headers: {@Headers}","Any");
                       builder.AllowAnyHeader(); 
                   }
                   else
                   {
                       Log.Information("Cors-headers: {@Headers}", configuration.GetSection("CorsConfig:AllowedHeaders").Value);
                       builder.WithHeaders(configuration.CorsHeaders());
                   }

                   if (configuration.UseAnyMethods())
                   {
                       Log.Information("Cors-Methods: {@Methods}", "Any");
                       builder.AllowAnyMethod();
                   }
                   else
                   {
                       Log.Information("Cors-Methods: {@Methods}", configuration.GetSection("CorsConfig:AllowedMethods").Value);
                       builder.WithMethods(configuration.CorsMethods());
                   }

                   Log.Information("Cors setup completed");
               });
            }
        }
 

This extension method is then used in Startup Configure method.

 public void Configure(IApplicationBuilder app, IWebHostEnvironment env, IApiVersionDescriptionProvider apiDescriptionProvider)
        {
            app.UseBasicConfiguration(env, "MyWebAPIName", null, apiDescriptionProvider);

            app.UseHttpsRedirection(); 

            app.UseRouting();

            app.UseMiddleware<ResponseHeaderMiddleware>();

            app.ConfigureCustomExceptionMiddleware();

            app.UseCorsSetup(Configuration);

            //app.UseForwardedHeaders();

            //app.UseHeaderPropagation();

            app.UseEndpoints(endpoints =>
            {
                endpoints.MapControllers();
            });
        }
 

Итак, есть какие-нибудь предложения о том, как устранить эту проблему?