Masalah dengan Kebijakan CORS dan .NET Core 3.1

12

Saya tidak yakin apa yang saya lewatkan, tetapi sepertinya tidak bisa mendapatkan Kebijakan CORS saya bekerja dengan .NET Core 3.1 dan sisi klien 8 Sudut.

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();
            });
        }

Pesan Kesalahan Sisi Klien:

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.

MEMPERBARUI:

Meskipun saya telah mengkonfigurasi CORS tidak benar (dan jawaban yang diterima di bawah itu sebenarnya bantuan dengan itu) akar masalah adalah tidak berhubungan. Untuk konteks tambahan, aplikasi berfungsi dengan baik saat menjalankan API dan aplikasi Angular menggunakan CLI - Saya hanya mengalami masalah ini setelah menempatkan keduanya ke server web.

Masalah "sebenarnya" pada akhirnya terkait dengan koneksi SQL, yang saya temukan setelah menambahkan kesalahan flat-file logging ke API dan menjalankan jejak SQL Server untuk menemukan bahwa aplikasi tidak dapat terhubung ke SQL sama sekali.

Saya biasanya berharap ini hanya mengembalikan 500 dan saya akan menyadari masalah ini dalam hitungan 10 detik - namun kesalahan konfigurasi CORS berarti 500 tidak pernah benar-benar dikembalikan karena middleware CORS gagal terlebih dahulu. Ini sangat frustasi untuk mengatakan yang paling tidak absolut! . Namun saya ingin menambahkan bahwa di sini kalau-kalau orang lain menemukan diri mereka dalam situasi ini, karena saya "mengejar kelinci yang salah," jika Anda mau. Setelah memperbaiki konfigurasi CORS, saya menyadari bahwa masalah sebenarnya sama sekali tidak terkait dengan CORS.

TL; DR; - Kadang-kadang "Non-CORS" .NET Server-side Error Dapat Dikembalikan sebagai Kesalahan CORS Jika kebijakan CORS Tidak Diatur dengan Benar

Referensi:

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
sumber
1
coba atur app.UseCors("foo");sebelumnyaapp.UseHttpsRedirection();
StepUp
@StupUp terima kasih atas rekomendasinya, tetapi masih belum berhasil
KMJungersen
Sudahkah Anda memecahkan masalah Anda?
StepUp
Adakah yang memecahkan masalah ini? Mengapa tidak ada jawaban yang diterima?
Waseem Ahmad Naeem
Ya, maaf saya tidak pernah kembali ke masalah ini setelah menyelesaikannya. Saya telah menambahkan pembaruan ke pertanyaan dengan beberapa konteks tambahan. Terima kasih!
KMJungersen

Jawaban:

21

pertama kalau app.UseRouting();begituapp.UseCors("foo");

Ubah Configuremetode Anda seperti berikut ini:

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();
    });
}

Itu berhasil untuk saya!

AbolfazlR
sumber
-Apakah ada paket nuget yang diperlukan?
chana
paket nuget untuk cors
chana
1
@chana - Anda tidak perlu menginstal paket
nuget
7
Saya terjebak pada masalah ini untuk HARI! tidak ada dari internet yang berfungsi. Solusi Anda dikombinasikan dengan ConfigureServiceskode OP memecahkan masalah saya. Terima kasih banyak!
Tahreem Iqbal
1
Apakah saya bingung selama berabad-abad. Terimakasih banyak!
Myles J
6

API Web menggunakan app.UseHttpsRedirection(); yang menyebabkan CORSmasalah jika meminta klien tidak httpsdidasarkan. Jadi untuk menggunakannya dengan httpklien kita perlu berkomentar atau menghapus baris itu.

Masalah ini bukan dengan CORS, https menyebabkan masalah ini tetapi kesalahan yang dilemparkan mengatakan ini dengan CORS.

Waseem Ahmad Naeem
sumber
Terima kasih kawan Ini menyelesaikan masalah saya
Reagan Gallant
1
Itu betul! baris UseHttpsRedirection () harus setelah UseCors ()
Eric
0

Ketika Anda menggunakan localhost sebagai http://localhost:4200, maka cobalah untuk mengaturnya di konfigurasi Anda:

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
     }
}

Dan Configuremetode:

public void Configure(IApplicationBuilder app, IHostingEnvironment env, IServiceProvider provider)
{
    if (env.IsDevelopment())
    {
        app.UseDeveloperExceptionPage();
    }
    app.UseCors("ApiCorsPolicy");
    app.UseHttpsRedirection();
    app.UseAuthentication();
    app.UseMvc();
}
StepUp
sumber
0

Saat menambahkan Layanan Cors, pastikan untuk memasukkan .SetIsOriginAllowed((host) => true)setelah.WithOrigins("http://localhost:4200")

services.AddCors(options => {
            options.AddPolicy("mypolicy",builder => builder
            .WithOrigins("http://localhost:4200/")
            .SetIsOriginAllowed((host) => true)
            .AllowAnyMethod()
            .AllowAnyHeader());
  });
Sean Baraka
sumber