ASP.NET Core'da CORS nasıl etkinleştirilir


190

ASP.NET Core Web API üzerinde çapraz kaynak paylaşımını etkinleştirmeye çalışıyorum, ancak takıldım.

EnableCorsÖzelliği, kabul policyNameÇeşidi stringparametre olarak:

// 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);

Ne anlama policyNamegelir ve ASP.NET Core Web API'sinde CORS'yi nasıl yapılandırabilirim ?


Yanıtlar:


328

Uygulama başlangıcında ConfigureServicesyöntemde bir CORS ilkesi yapılandırmanız gerekir :

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

    // ...
}

CorsPolicyBuilderİçinde buildersen ihtiyaçlarınıza politikasını yapılandırmasına izin verir. Artık bu adı, ilkeyi denetleyicilere ve eylemlere uygulamak için kullanabilirsiniz:

[EnableCors("MyPolicy")]

Veya her talebe uygulayın:

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

12
Ben app.UseCors ("MyPolicy") benim API uç noktaları için işe yaramadı buldum. Açıkça söz konusu denetleyici uç noktalarında [EnableCors ("MyPolicy")] gerekiyordu.
robbpriestley

9
Gönderen resmi dokümanlar : Tüm uygulama kullanarak istek boru hattına CORS Middleware sistemi eklemek için "CORS'yi etkinleştirmek için UseCorsuzatma yöntemi Not CORS katman (ex arası kökenli taleplerini desteklemek istediğiniz uygulamanızda herhangi tanımlı uç noktaları önce gelmesi. . herhangi bir çağrıdan önce UseMvc). "
Alex Klaus

2
App.AddMvc () sonra app.UseCors () ekledim ve işe yaramadı. Çünkü Kullanım yöntemleri, ara katman yazılımı çalışma şeklini etkiler!
Obay Abd-Algader

1
Herhangi bir kökene izin verme riski var mı?
Percy

Microsoft.AspNetCore.Cors külçe paketi eksik olduğu için bu yanıt benim için çalışmadı.
Reven

108

.NET Core 1 ve .Net Core 2 (daha aşağı) için geçerlidir

Kullanıyorsanız .Net-Core 1.1

Ne yazık ki dokümanlar bu özel durumda çok kafa karıştırıcı. Bu yüzden onu basitleştireceğim:

  • Microsoft.AspNetCore.CorsProjenize nuget paketi ekleyin
  • In ConfigureServicesyöntemine eklemekservices.AddCors();
  • In Configureyöntemle, aramadan önce app.UseMvc()ve app.UseStaticFiles()ekleyin:

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

Bu kadar. Her istemcinin ASP.NET Temel Web Sitesi / API'nize erişimi vardır.


Kullanıyorsanız .Net-Core 2.0

  • Microsoft.AspNetCore.CorsProjenize nuget paketi ekleyin
  • içinde ConfigureServicesyöntemle, daha önce çağrıda services.AddMvc()ekleyin:

     services.AddCors(options =>
        {
            options.AddPolicy("AllowAll",
                builder =>
                {
                    builder
                    .AllowAnyOrigin() 
                    .AllowAnyMethod()
                    .AllowAnyHeader()
                    .AllowCredentials();
                });
        });
  • (Önemli) olarak Configureyöntemle, önce arama app.UseMvc(), eklenti app.UseCors("AllowAll");

    AllowAllapp.UserCors uygulamasında belirtmemiz gereken politika adıdır. Herhangi bir isim olabilir.


2
doğru, düşündüm bunlardan sadece birini etkinleştirebilirsiniz!
eugeneK

7
Teşekkürler. UseMvc sonra benim AddCors vardı ve düzgün çalışmıyor neden oldu. Bundan bahseden tek cevap sizindir.
JesseNewman19

1
Bu işe yaramıyor sanmıyorum. Kimlik bilgileri sağlarken, herhangi bir kaynağa izin veremezsiniz. Ben hala bunu işe almaya çalışıyorum.
Jason Goemaat

7
Bu anahtar parça: .UseCors()önce.UseMvc()
Neps

3
UserMvc önce UseCors bilmeden ile boşa zaman ... yardım için teşekkürler!
Thomas

37

Henk'in cevabına dayanarak , belirli bir alan adı, izin vermek istediğim yöntem ve ayrıca CORS'yi etkinleştirmek istediğim başlığı da bulabildim:

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

kullanımı:

[EnableCors("AllowSpecific")]

Bu soruya bir cevap vermez. Bir yazardan eleştiri veya açıklama istemek için gönderilerinin altına bir yorum bırakın.
zrvan

14
To critique or request clarification from an authorBurada böyle olduğunu sanmıyorum ve Henk'in cevabı zaten işaretlendi. Belirli alanlara izin vermek istiyorsanız cevabım bir eklentiydi.
Oluwafemi

Kodunuzda bir şey eksik, 'IServiceCollection', 'ConfigureCors' için bir tanım içermiyor. Lütfen kontrol edin ve eksiksiz bir cevap vermeye çalışın.
Sami-L

@ Sami-L Lütfen güncellenmiş cevabımı kontrol edin. Bunun ConfigureCorsolarak değiştirildiğini öğrendim AddCors.
Oluwafemi


7

IIS'de barınıyorsanız, bunun olası bir nedeni, IIS'nin OPTIONSfiili engellemesidir . Bu yüzden neredeyse bir saat geçirdim:

Bir belirti göstergesi, istek 404sırasında hata alıyorsunuz OPTIONS.

Bunu düzeltmek için, açıkça IIS söylememe gerek yok blok için OPTIONSistek.

İstek Filtresi'ne gidin:

IIS İstek Filtreleme

SEÇENEKLERE izin verildiğinden emin olun:

OPTIONS seçeneğinin Doğru olduğundan emin olun

Veya web.configaşağıdaki ayara sahip bir a oluşturun :

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

7

Startup.cs sınıfında yapılandırmanız gerekir

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

6

İle bu çalışma var .Net Çekirdek 3.1 aşağıdaki gibi

1. UseCors kodunu app.UseRouting () arasına yerleştirdiğinizden emin olun; ve app.UseAuthentication ();

        app.UseHttpsRedirection();

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

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

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

Daha sonra bu kodu ConfigureServices yöntemine yerleştirin

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

3.Ve taban denetleyicisinin üstüne bunu yerleştirdim

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

Şimdi tüm denetleyicilerim BaseController'dan miras alacak ve CORS etkin olacak


Benim için işler werent I kadarplace the UseCors code between app.UseRouting(); and app.UseAuthentication();
0014

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

'


1
Önceden dağıtılmış tarayıcı güvenliğini atlatmanın harika bir yolu. Sadece yapma!
JCKödel

2
Bunun aşağı oy verilmesi gerektiğini düşünmüyorum. Bu "alternatif" bir yoldur. "UseCors ()" yöntemini kullanabilir veya Nathan'ın burada yaptığı gibi global bir MVC filtresi ekleyebilirsiniz.
Josh Mouch

bu benim için çalışıyor .net core 2.2 artı app eklemeCors ("AllowAnyOrigin"); Configure "yönteminde
Harry Sarshogh

"Projenize Microsoft.AspNetCore.Cors nuget paketini eklemek" önemlidir. Bahsettiğiniz için teşekkürler!
Mason Zhang

1

Adım 1: Projemizde Microsoft.AspNetCore.Cors paketine ihtiyacımız var. Kurulum için Araçlar -> NuGet Paket Yöneticisi -> NuGet Paketlerini Çözüm için Yönetme bölümüne gidin. Microsoft.AspNetCore.Cors öğesini arayın ve paketi yükleyin.

Adım 2: Uygulama tarafından kullanılabilmesi için CORS'yi kaba enjekte etmemiz gerekir. Startup.cs sınıfında, ConfigureServices yöntemine gidelim ve CORS'i kaydedelim.

resim açıklamasını buraya girin

Yani, sunucu uygulamamızda, Kontrolörler -> HomeController.cs adresine gidelim ve EnableCors dekoratörünü Dizin yöntemine ekleyelim (Veya özel denetleyiciniz ve eyleminiz):

resim açıklamasını buraya girin

Daha Fazla Detay İçin Tıklayınız


0

Yukarıda belirtilen tüm geçici çözümler işe yarayabilir veya çalışmayabilir, çoğu durumda çalışmaz. Burada çözümü verdim

Şu anda Angular ve Web API (.net Core) üzerinde çalışıyorum ve aşağıda açıklanan CORS sorunuyla karşılaştım

Yukarıda verilen çözüm her zaman işe yarayacaktır. 'SEÇENEKLER' isteği ile 'Anonim Kimlik Doğrulaması'nın etkinleştirilmesi gerçekten gereklidir. Burada bahsedilen çözümle, yukarıda IIS ayarları gibi yukarıda belirtilen tüm adımları uygulamanız gerekmez.

Neyse birisi benim yukarıdaki yazı bu yazı ile yinelenen olarak işaretlenmiş, ancak bu yazı sadece ASP.net Core CORS etkinleştirmek olduğunu görebilirsiniz, ancak benim yazı, ASP.net Core ve Angular CORS etkinleştirme ve uygulama ile ilgilidir.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.