Cara mengaktifkan CORS di ASP.NET Core

190

Saya mencoba untuk mengaktifkan berbagi sumber daya lintas asal di ASP.NET Core Web API saya, tetapi saya buntu.

The EnableCorsatribut menerima policyNametipe stringsebagai parameter:

// Summary:
//     Creates a new instance of the Microsoft.AspNetCore.Cors.Core.EnableCorsAttribute.
//
// Parameters:
//   policyName:
//     The name of the policy to be applied.
public EnableCorsAttribute(string policyName);

Apa policyNamemaksudnya dan bagaimana saya bisa mengkonfigurasi CORS pada ASP.NET Core Web API?

Oluwafemi
sumber
1
di sini adalah artikel docs.microsoft.com/en-us/aspnet/core/security/cors
Elaine

Jawaban:

328

Anda harus mengonfigurasi kebijakan CORS saat startup aplikasi dalam ConfigureServicesmetode:

public void ConfigureServices(IServiceCollection services)
{
    services.AddCors(o => o.AddPolicy("MyPolicy", builder =>
    {
        builder.AllowAnyOrigin()
               .AllowAnyMethod()
               .AllowAnyHeader();
    }));

    // ...
}

The CorsPolicyBuilderdalam buildermemungkinkan Anda untuk mengkonfigurasi kebijakan dengan kebutuhan Anda. Anda sekarang dapat menggunakan nama ini untuk menerapkan kebijakan ke pengontrol dan tindakan:

[EnableCors("MyPolicy")]

Atau menerapkannya pada setiap permintaan:

public void Configure(IApplicationBuilder app)
{
    app.UseCors("MyPolicy");

    // ...

    // This should always be called last to ensure that
    // middleware is registered in the correct order.
    app.UseMvc();
}
Henk Mollema
sumber
12
Saya menemukan bahwa app.UseCors ("MyPolicy") tidak berfungsi untuk titik akhir API saya. Saya perlu secara eksplisit [EnableCors ("MyPolicy")] pada titik akhir pengontrol yang dimaksud.
robbpriestley
9
Dari dokumen resmi : "Untuk mengaktifkan CORS untuk seluruh aplikasi Anda, tambahkan middleware CORS ke saluran permintaan Anda menggunakan UseCorsmetode ekstensi. Perhatikan bahwa middleware CORS harus mendahului titik akhir yang ditentukan dalam aplikasi Anda yang ingin Anda dukung permintaan lintas-asal (mis. sebelum ada panggilan ke UseMvc). "
Alex Klaus
2
Saya menambahkan app.UseCors () setelah app.AddMvc () dan tidak berfungsi. Karena urutan metode Penggunaan memengaruhi cara kerja middleware!
Obay Abd-Algader
1
Apakah ada risiko mengizinkan asal?
Percy
Jawaban ini tidak berhasil untuk saya, karena tidak ada paket nuget Microsoft.AspNetCore.Cors hilang.
Reven
108

Berlaku untuk .NET Core 1 dan .Net Core 2 (lebih jauh ke bawah)

Jika menggunakan .Net-Core 1.1

Sayangnya dokumen sangat membingungkan dalam kasus khusus ini. Jadi saya akan membuatnya sangat sederhana:

  • Menambahkan Microsoft.AspNetCore.Corspaket nuget ke proyek Anda
  • Dalam ConfigureServicesmetode, tambahkanservices.AddCors();
  • Dalam Configuremetode, sebelum memanggil app.UseMvc()dan app.UseStaticFiles(), tambahkan:

    app.UseCors(builder => builder
        .AllowAnyOrigin()
        .AllowAnyMethod()
        .AllowAnyHeader()
        .AllowCredentials());

Itu dia. Setiap klien memiliki akses ke ASP.NET Core Website / API Anda.


Jika menggunakan .Net-Core 2.0

  • Tambahkan Microsoft.AspNetCore.Corspaket nuget ke proyek Anda
  • dalam ConfigureServicesmetode, sebelum memanggil services.AddMvc(), tambahkan:

     services.AddCors(options =>
        {
            options.AddPolicy("AllowAll",
                builder =>
                {
                    builder
                    .AllowAnyOrigin() 
                    .AllowAnyMethod()
                    .AllowAnyHeader()
                    .AllowCredentials();
                });
        });
  • (Penting) Dalam Configuremetode, sebelum memanggil app.UseMvc(), tambahkan app.UseCors("AllowAll");

    AllowAlladalah nama kebijakan yang perlu kami sebutkan di app.UserCors. Bisa nama apa saja.

Vahid Amiri
sumber
2
benar, kupikir aku bisa mengaktifkan salah satunya saja!
eugeneK
7
Terima kasih. Saya memiliki AddCors saya setelah UseMvc dan itu menyebabkannya tidak berfungsi dengan baik. Anda adalah satu-satunya jawaban yang menyebutkan ini.
JesseNewman19
1
Saya pikir ini tidak berhasil. Saat memberikan kredensial, Anda tidak dapat mengizinkan sumber apa pun. Saya masih mencoba untuk membuatnya bekerja.
Jason Goemaat
7
Itulah bagian kunci: .UseCors()sebelumnya.UseMvc()
Neps
3
Membuang waktu dengan tidak mengetahui tentang UseCors sebelum UserMvc ... terima kasih atas bantuannya!
Thomas
37

Berdasarkan jawaban Henk, saya dapat menemukan domain spesifik, metode yang ingin saya izinkan, dan juga header yang ingin saya aktifkan CORS untuk:

public void ConfigureServices(IServiceCollection services)
{
    services.AddCors(options =>
         options.AddPolicy("AllowSpecific", p => p.WithOrigins("http://localhost:1233")
                                                   .WithMethods("GET")
                                                   .WithHeaders("name")));
    services.AddMvc();
}

pemakaian:

[EnableCors("AllowSpecific")]
Oluwafemi
sumber
Ini tidak memberikan jawaban untuk pertanyaan itu. Untuk mengkritik atau meminta klarifikasi dari penulis, tinggalkan komentar di bawah posting mereka.
zrvan
14
To critique or request clarification from an authorSaya tidak berpikir itu yang terjadi di sini dan jawaban Henk sudah ditandai. Jawaban saya adalah add-on jika Anda ingin mengizinkan domain tertentu.
Oluwafemi
Ada yang hilang dalam kode Anda, 'IServiceCollection' tidak mengandung definisi untuk 'ConfigureCors'. Silakan periksa dan coba berikan jawaban yang lengkap.
Sami-L
@ Sami-L Silakan periksa jawaban saya yang diperbarui. Saya menemukan bahwa ConfigureCorsdiubah menjadi AddCors.
Oluwafemi
9

Khususnya di dotnet core 2.2 dengan SignalR Anda harus berubah

.WithOrigins("http://localhost:3000") atau

.SetIsOriginAllowed(isOriginAllowed: _ => true) //for all origins

alih .AllowAnyOrigin()- alih dengan.AllowCredentials()

https://trailheadtechnology.com/breaking-change-in-aspnetcore-2-2-for-signalr-and-cors/

https://github.com/aspnet/AspNetCore/issues/4483

PJ3
sumber
Menggunakan SignalR di aplikasi .NET Core console dan ini adalah satu-satunya solusi yang berfungsi untuk skenario saya.
asdf
7

Jika Anda hosting di IIS, salah satu alasan yang mungkin adalah Anda mendapatkan ini karena IIS memblokir OPTIONS kata kerja. Saya menghabiskan hampir satu jam karena ini:

Salah satu indikasi adalah Anda mendapatkan 404kesalahan selamaOPTIONS permintaan.

Untuk memperbaikinya, Anda harus secara eksplisit memberi tahu IIS untuk tidak memblokirOPTIONS permintaan.

Pergi ke Pemfilteran Permintaan:

Penyaringan Permintaan IIS

Pastikan OPSI diizinkan:

Pastikan OPSI Benar

Atau, buat saja web.configdengan pengaturan berikut:

<system.webServer>
    <security>
        <requestFiltering>
            <verbs>
                <remove verb="OPTIONS" />
                <add verb="OPTIONS" allowed="true" />
            </verbs>
        </requestFiltering>
    </security>
</system.webServer>
Rosdi Kasim
sumber
7

Anda harus mengonfigurasi di kelas Startup.cs

services.AddCors(options =>
        {
            options.AddPolicy("CorsPolicy",
                builder => builder.AllowAnyOrigin()
                .AllowAnyMethod()
                .AllowAnyHeader()
                .AllowCredentials());
        });
Sunil Dhappadhule
sumber
5

`

    public void ConfigureServices(IServiceCollection services)
    {
        services.AddCors(options =>
        {
            options.AddPolicy("AllowAnyOrigin",
                builder => builder
                .AllowAnyOrigin()
                .AllowAnyMethod()
                .AllowAnyHeader());
        });

        services.Configure<MvcOptions>(options => {
            options.Filters.Add(new CorsAuthorizationFilterFactory("AllowAnyOrigin"));
        });            
    }

`

Nathan Alard
sumber
1
Cara luar biasa untuk menghindari keamanan browser yang sudah digunakan. Hanya saja, jangan!
JCKödel
2
Saya tidak berpikir ini harus dipilih. Ini adalah cara "alternatif". Anda bisa menggunakan metode "UseCors ()" atau menambahkan filter MVC global seperti yang dilakukan Nathan di sini.
Josh Mouch
ini berfungsi untuk saya di .net core 2.2 plus menambahkan app.UseCors ("AllowAnyOrigin"); dalam metode "Konfigurasi"
Harry Sarshogh
Sangat penting untuk "Tambahkan paket nuget Microsoft.AspNetCore.Cors ke proyek Anda". Terima kasih telah menyebutkannya!
Mason Zhang
5

Dapatkan ini berfungsi dengan .Net Core 3.1 sebagai berikut

1. Pastikan Anda menempatkan kode UseCors di antara app.UseRouting (); dan app.UseAuthentication ();

        app.UseHttpsRedirection();

        app.UseRouting();
        app.UseCors("CorsApi");

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

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

2.Lalu letakkan kode ini dalam metode ConfigureServices

services.AddCors(options =>
        {
            options.AddPolicy("CorsApi",
                builder => builder.WithOrigins("http://localhost:4200", "http://mywebsite.com")
            .AllowAnyHeader()
            .AllowAnyMethod());
        });

3. Dan di atas pengontrol dasar saya menempatkan ini

[EnableCors("CorsApi")]
[Route("api/[controller]")]
[ApiController]
public class BaseController : ControllerBase

Sekarang semua pengendali saya akan mewarisi dari BaseController dan CORS akan diaktifkan

tfa
sumber
Hal-hal yang tidak berfungsi bagi saya sampai sayaplace the UseCors code between app.UseRouting(); and app.UseAuthentication();
0014
1

Langkah 1: Kami membutuhkan paket Microsoft.AspNetCore.Cors dalam proyek kami. Untuk menginstal masuk ke Tools -> NuGet Package Manager -> Kelola Paket NuGet untuk Solusi. Cari Microsoft.AspNetCore.Cors dan instal paket.

Langkah 2: Kita perlu menyuntikkan CORS ke dalam wadah sehingga dapat digunakan oleh aplikasi. Di kelas Startup.cs, mari kita pergi ke metode ConfigureServices dan mendaftar CORS.

masukkan deskripsi gambar di sini

Jadi, di aplikasi server kami, mari pergi ke Pengontrol -> HomeController.cs dan tambahkan dekorator EnableCors ke metode Indeks (Atau pengontrol dan tindakan spesifik Anda):

masukkan deskripsi gambar di sini

Untuk Lebih Detail, Klik Di Sini

shebin c babu
sumber
0

Semua solusi yang disebutkan di atas dapat bekerja atau mungkin tidak berhasil, dalam banyak kasus itu tidak akan berhasil. Saya sudah memberikan solusinya di sini

Saat ini saya sedang mengerjakan Angular dan Web API (.net Core) dan menemukan masalah CORS yang dijelaskan di bawah ini

Solusi yang diberikan di atas akan selalu berhasil. Dengan permintaan 'OPSI' itu benar-benar perlu untuk mengaktifkan 'Otentikasi Anonim'. Dengan solusi yang disebutkan di sini, Anda tidak harus melakukan semua langkah yang disebutkan di atas, seperti pengaturan IIS.

Anyways seseorang menandai posting saya di atas sebagai duplikat dengan posting ini, tetapi saya dapat melihat bahwa posting ini hanya untuk mengaktifkan CORS di ASP.net Core, tetapi posting saya terkait dengan, Mengaktifkan dan menerapkan CORS di ASP.net Core dan Angular.

Shivang Kaul
sumber