Настроить Strict Cors. Net Core 3.1 - PullRequest
4 голосов
/ 04 августа 2020

У меня есть веб-API publi c analytics (. Net Core 3.1), который собирает основную c аналитику из моих различных веб-приложений и сайтов (просмотры страниц и т. Д. c). Я бы очень хотел настроить cors более строго, так как мне хорошо известно, откуда должен поступать трафик c. Стоит отметить, что я обновляю это приложение с .Net Core 2.2 до .Net Core 3.1.

У меня есть следующий метод в моем Startup.cs файле

public void ConfigureServices(IServiceCollection services)
{
  ...
  ConfigureCors(services);
}

private void ConfigureCors(IServiceCollection services)
{
  // https://weblog.west-wind.com/posts/2016/Sep/26/ASPNET-Core-and-CORS-Gotchas
  services.AddCors(options =>
  {
        options.AddPolicy("CorsPolicy",
             builder => builder.WithOrigins(AppConfiguration.CorsOrigins)
             .AllowAnyMethod()
             .AllowAnyHeader());
  });
}

public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
  {
      if (env.IsDevelopment())
      {
        app.UseDeveloperExceptionPage();
      }

      app.UseRouting();
      app.UseCors("CorsPolicy");
      app.UseAuthentication();
      app.UseAuthorization();

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

AppConfiguration - это класс, который я использую для обработки конфигураций, и он получает json значений, используя следующее: public string[] CorsOrigins => _config["CorsOrigins"].Split(',');

В appsettings.Development.json у меня есть "CorsOrigins": "*"

Я бы очень хотел указать строгое происхождение в файлах appsettings.Production.json и appsettings.Staging.json. Например, "CorsOrigins": "https://subdomain.example.com,https://www.example.com,https://example.com", но при развертывании я получаю статус 502 всякий раз, когда веб-сайты / приложения достигают различных конечных точек.

"CorsOrigins": "*" работает на локальном компьютере, поэтому не может быть ничего плохого с * Насколько мне известно, файл 1025 *.

Обновление: "CorsOrigins": "*" на самом деле не работает для промежуточной или производственной среды. Теперь я еще больше запутался. Для ясности, это cors вопрос. Следующие параметры работали нормально до обновления до .Net Core 3.1:

private void ConfigureCors(IServiceCollection services)
      services.AddCors(options =>
      {
        options.AddPolicy("CorsPolicy",
             builder => builder.AllowAnyOrigin()
             .AllowAnyMethod()
             .AllowAnyHeader()
             .AllowCredentials());
      });
    }

введите описание изображения здесь

Ответы [ 2 ]

1 голос
/ 05 августа 2020

Позаботьтесь о том, чтобы разместить UseCors в правильном месте. Из документы :

Вызов UseCors должен быть после UseRouting, но перед UseAuthorization.

Как отмечено в комментариях, разрешение «*» в качестве источника недопустимо с помощью AllowCredentials.

Вот рабочий пример конфигурации CORS из моего проекта AS PNET Core 3.1. Он выполняет конфигурацию в методе Configure вместо ConfigureServices, но с тем же содержанием:

// Startup.cs

public void ConfigureServices(IServiceCollection services)
{
    services.AddCors();
    // etc
}

public void Configure(IApplicationBuilder app)
{
    // other configs

    app.UseRouting();

    // CORS configuration. Expects allowed origins as comma-separated list in config under 'Cors:AllowedOrigins'.
    string configuredOrigins = Configuration["Cors:AllowedOrigins"] ?? throw new ArgumentNullException("Cors:AllowedOrigins");
    string[] origins = configuredOrigins.Split(',', ';').Select(i => i.Trim()).ToArray();
    app.UseCors(policy => policy
        .WithOrigins(origins)
        .AllowAnyMethod()
        .AllowAnyHeader()
        .AllowCredentials() // Required by SignalR
        .WithExposedHeaders(CONTINUATION_HEADER_KEY) // Allow use of custom header
        .SetPreflightMaxAge(TimeSpan.FromSeconds(86400))); // Allow caching for 24 hours (depends on browser)

    app.UseAuthentication();
    app.UseAuthorization();

    // other configs
}
0 голосов
/ 04 августа 2020

Извините, это сложный вопрос, поэтому может быть ряд причин, по которым он не работает, но я столкнулся с аналогичной проблемой и решил ее, изменив вызов cors в функции Configure (). Функция Configure () вызывается во время выполнения и действует как конвейер HTTP-запросов, поэтому в некоторых случаях порядок выполнения имеет значение (https://docs.microsoft.com/en-us/aspnet/core/fundamentals/startup?view=aspnetcore-3.1#the -configure-method )

Вы можете попробовать следующее:

Изменить текущий:

public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
  {
      if (env.IsDevelopment())
      {
        app.UseDeveloperExceptionPage();
      }

      app.UseRouting();
      app.UseAuthentication();
      app.UseAuthorization();
      app.UseCors("CorsPolicy"); //Move this line 

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

To:

public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
  {
      if (env.IsDevelopment())
      {
        app.UseDeveloperExceptionPage();
      }

      app.UseRouting();

      app.UseCors("CorsPolicy"); // Here

      app.UseAuthentication();
      app.UseAuthorization();

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

Следовательно, первой операцией в конвейере http будет проверка cors. Я считаю, что это честная ставка, так как из вашего вопроса похоже, что вы не получаете ошибку инициализации приложения, а скорее ошибку времени запроса клиента во время выполнения. Не знаю наверняка, решит ли это проблему, но, может быть, это поможет!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...