Как я должен настроить net core api cors?

#asp.net-web-api #asp.net-core-webapi #content-security-policy

Вопрос:

Я кодирую неофициальный api twitter для себя. Затем я отправляю запрос на этот api, используя экран консоли в моем браузере, следующим способом.

 function httpGet(theUrl)
{
    var xmlHttp = new XMLHttpRequest();
    xmlHttp.open( "GET", theUrl, false ); // false for synchronous request
    xmlHttp.send( null );
    return xmlHttp.responseText;
}
 

такой

 httpGet(https://localhost:44311/WeatherForecast/alienationxs/true);
 

проблема в том, что когда я делаю это через www.google.com все в порядке, и данные json доходят до меня. но когда я делаю это через twitter.com Я получаю следующую ошибку.

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

через google.com

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

мои настройки cors в api

 public void ConfigureServices(IServiceCollection services)
        {
            services.AddControllers();
            services.AddCors(options =>
      options.AddDefaultPolicy(builder =>
      builder.AllowAnyHeader().AllowAnyMethod().AllowAnyOrigin())); ;
           
            services.AddMvc();
            services.AddSwaggerGen(c =>
            {
                c.SwaggerDoc("v1", new OpenApiInfo { Title = "twitterAPI", Version = "v1" });
            });
        }

        // This method gets called by the runtime. Use this method to configure the HTTP request pipeline.
        public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
        {
           
            if (env.IsDevelopment())
            {
                app.UseDeveloperExceptionPage();
                app.UseSwagger();
                app.UseSwaggerUI(c => c.SwaggerEndpoint("/swagger/v1/swagger.json", "twitterAPI v1"));
            }

           
            app.UseRouting();
            app.UseCors(builder => builder
             .AllowAnyOrigin()
             .AllowAnyMethod()
             .AllowAnyHeader());
            app.UseAuthorization();
            app.UseEndpoints(endpoints =>
            {
                endpoints.MapControllers();
            });
        }
 

все, что я хочу, — это получить доступ к своему api через twitter.com так же, как google.com.

Комментарии:

1. если вы можете подключиться google.com, вы должны убедиться, что этот API twitter может быть доступен в первую очередь

Ответ №1:

  1. Во-первых, давайте отделим мух от котлет.
  • Совместное использование ресурсов между источниками (CORS)-это отдельный уровень безопасности.
  • Политика безопасности контента (CSP) — это отдельный уровень безопасности, он применяется до CORS. После прохождения CSP вы можете столкнуться с CORS, если последний из них будет нарушен.

Как вы можете видеть из сообщения об ошибке «… потому что это нарушает следующую директиву Политики безопасности контента …«, вы столкнулись с нарушением CSP, поэтому ваши настройки CORS не имеют значения.

  1. Что происходит.

Вы заходите twitter.com на веб-страницу и пытаетесь выполнить запрос на подключение localhost:44311 от имени веб-страницы Twitter. Но веб-страница Twitter защищена CSP, который запрещает такие запросы: введите описание изображения здесьобратите внимание на директиву «connect-src», которая регулирует XMLHttpRequest().

На www.google.com веб-странице нет CSP, поэтому ваш запрос от имени Google выполняется успешно.

Комментарии:

1. Так есть ли какой-нибудь способ обойти это?

2. Ни за что. Обход CSP в Chrome стоит 20 000 долларов в рамках программы вознаграждения за ошибки.

Ответ №2:

API Twitter не поддерживает CORS.

Комментарии:

1. Очистка Twitter противоречит Условиям предоставления услуг. Я удалю тег twitter из вашего поста, так как вы спрашиваете об общей проблеме веб-программирования, а не о Twitter.