Проблемы с политикой CORS и .NET Core 3.1

12

Я не уверен, что мне не хватает, но не могу заставить мою политику CORS работать с .NET Core 3.1 и Angular 8 на стороне клиента.

Startup.cs:

        public void ConfigureServices(IServiceCollection services)
        {
            // ...

            // Add CORS policy
            services.AddCors(options =>
            {
                options.AddPolicy("foo",
                builder =>
                {
                    // Not a permanent solution, but just trying to isolate the problem
                    builder.AllowAnyOrigin().AllowAnyMethod().AllowAnyHeader();
                });
            });

            services.AddControllers();
        }

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

            app.UseHttpsRedirection();

            // Use the CORS policy
            app.UseCors("foo");

            app.UseRouting();

            app.UseAuthorization();

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

Сообщение об ошибке на стороне клиента:

Access to XMLHttpRequest at 'https://localhost:8082/api/auth/' from origin 'http://localhost:4200' has been blocked by CORS policy: No 'Access-Control-Allow-Origin' header is present on the requested resource.

ОБНОВИТЬ:

Хотя я была настройка CORS неправильно (и общепринятый ответ ниже и в самом деле помочь с этим) корень вопроса не был связан. Для дополнительного контекста, приложение работало совершенно нормально при запуске API и приложения Angular с использованием CLI - у меня возникла эта проблема только после их развертывания на веб-сервере.

«Фактическая» проблема закончилась тем , что был связан с соединением SQL, который я только обнаружил после добавления плоско-файл регистрации ошибок в API и запустить трассировку SQL Server , чтобы найти , что приложение не может подключиться к SQL на всех.

Я обычно ожидал бы, что это просто вернет 500, и я понял бы проблему в течение 10 секунд - однако неправильная конфигурация CORS означала, что 500 фактически никогда не возвращался, потому что промежуточное программное обеспечение CORS сначала отказало. Это было очень неприятно, если не сказать больше! , Однако я хочу добавить, что здесь, на случай, если другие окажутся в такой ситуации, как я «гоняюсь за неправильным кроликом», если хотите. После исправления конфигурации CORS я понял, что проблема не связана с CORS.

TL; DR; - Иногда «не-CORS» .NET-ошибки на стороне сервера могут быть возвращены как ошибки CORS, если политики CORS не установлены правильно

Ссылки:

https://docs.microsoft.com/en-us/aspnet/core/security/cors?view=aspnetcore-3.1#cors-with-named-policy-and-middleware

https://medium.com/swlh/cors-headers-with-dot-net-core-3-5c9dfc664785

KMJungersen
источник
1
попробуйте установить app.UseCors("foo");доapp.UseHttpsRedirection();
StepUp
@StepUp спасибо за рекомендацию, но все равно не повезло
KMJungersen
Вы решили свою проблему?
стартап
Кто-нибудь решил эту проблему? Почему ответ не принят?
Васим Ахмад Наим
Да, извините, я никогда не возвращался к этой проблеме после ее решения. Я добавил обновление к вопросу с дополнительным контекстом. Спасибо!
KMJungersen

Ответы:

21

сначала app.UseRouting();тогдаapp.UseCors("foo");

Измените свой Configureметод следующим образом:

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

    app.UseHttpsRedirection();



    app.UseRouting();  // first
    // Use the CORS policy
    app.UseCors("foo"); // second

    app.UseAuthorization();

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

Это сработало для меня!

AbolfazlR
источник
- нужен ли пакет Nuget?
хана
NuGet пакет для CORS
Chana
1
@chana - вам не нужно устанавливать пакет
nuget
7
Я застрял в этом вопросе на ДНИ! ничего из интернета не сработало. Ваше решение в сочетании с ConfigureServicesкодом OP решило мою проблему. Большое спасибо!
Тарим Икбал
1
Если бы я был в тупике целую вечность. Большое спасибо!
Майлз Дж
6

Веб API использует app.UseHttpsRedirection(); которые вызывают CORSпроблему, если запрос клиента не httpsоснован. Таким образом, чтобы использовать его с httpклиентом, нам нужно закомментировать или удалить эту строку.

Эта проблема не с CORS, HTTPS вызывает эту проблему, но брошенная ошибка говорит, что с CORS.

Васим Ахмад Наим
источник
Спасибо мужчина. Это решило мою проблему
Рейган Галлант
1
Это правильно! строка UseHttpsRedirection () должна быть после UseCors ()
Эрик
0

Поскольку вы используете localhost as http://localhost:4200, попробуйте установить его в своей конфигурации:

public void ConfigureServices(IServiceCollection services)
{
    services.AddCors(options => options.AddPolicy("ApiCorsPolicy", build =>
    {                
        build.WithOrigins("http://localhost:4200")
             .AllowAnyMethod()
             .AllowAnyHeader();
        }));
        // ... other code is omitted for the brevity
     }
}

И Configureметод:

public void Configure(IApplicationBuilder app, IHostingEnvironment env, IServiceProvider provider)
{
    if (env.IsDevelopment())
    {
        app.UseDeveloperExceptionPage();
    }
    app.UseCors("ApiCorsPolicy");
    app.UseHttpsRedirection();
    app.UseAuthentication();
    app.UseMvc();
}
стартап
источник
0

При добавлении сервиса Cors обязательно включите .SetIsOriginAllowed((host) => true)после.WithOrigins("http://localhost:4200")

services.AddCors(options => {
            options.AddPolicy("mypolicy",builder => builder
            .WithOrigins("http://localhost:4200/")
            .SetIsOriginAllowed((host) => true)
            .AllowAnyMethod()
            .AllowAnyHeader());
  });
Шон Барака
источник