Jak włączyć CORS w ASP.NET Core


189

Próbuję włączyć udostępnianie zasobów pochodzących z różnych źródeł w moim interfejsie API sieci Web platformy ASP.NET Core, ale utknąłem.

EnableCorsAtrybut przyjmuje policyNametypu stringjako parametru:

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

Co to policyNameznaczy i jak mogę skonfigurować CORS w interfejsie API sieci Web platformy ASP.NET Core?


Odpowiedzi:


327

Musisz skonfigurować zasadę CORS przy uruchomieniu aplikacji w ConfigureServicesmetodzie:

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

    // ...
}

CorsPolicyBuilderW builderpozwala skonfigurować zasady do swoich potrzeb. Teraz możesz użyć tej nazwy, aby zastosować zasady do kontrolerów i działań:

[EnableCors("MyPolicy")]

Lub zastosuj go do każdego żądania:

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
Odkryłem, że aplikacja UseCors („MyPolicy”) nie działała dla moich punktów końcowych interfejsu API. Musiałem jawnie [EnableCors („MyPolicy”)] na punktach końcowych kontrolera, o których mowa.
robbpriestley

9
Z oficjalnych dokumentów : „Aby włączyć CORS dla całej aplikacji, dodaj oprogramowanie pośrednie CORS do potoku żądań przy użyciu UseCorsmetody rozszerzenia. Pamiętaj, że oprogramowanie pośrednie CORS musi poprzedzać wszelkie zdefiniowane punkty końcowe w aplikacji, które mają obsługiwać żądania między źródłami (np. . przed każdym połączeniem UseMvc). ”
Alex Klaus

2
Dodałem app. UseCors () po app.AddMvc () i to nie działało. Ponieważ kolejność metod użycia wpływa na działanie oprogramowania pośredniego!
Obay Abd-Algader

1
Czy istnieje ryzyko dopuszczenia jakiegokolwiek pochodzenia?
Percy

Ta odpowiedź nie działała dla mnie z powodu braku pakietu nuget Microsoft.AspNetCore.Cors.
Reven

108

Dotyczy .NET Core 1 i .Net Core 2 (dalej w dół)

Jeśli używasz .Net-Core 1.1

Niestety w tej konkretnej sprawie dokumenty są bardzo mylące. Sprawię, że będzie to bardzo proste:

  • Dodaj Microsoft.AspNetCore.Corspakiet nuget do swojego projektu
  • W ConfigureServicesmetodzie dodajservices.AddCors();
  • W Configuremetodzie przed wywołaniem app.UseMvc()i app.UseStaticFiles()dodaj:

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

Otóż ​​to. Każdy klient ma dostęp do Twojej witryny / interfejsu API ASP.NET Core.


Jeśli używasz .Net-Core 2.0

  • Dodaj Microsoft.AspNetCore.Corspakiet nuget do swojego projektu
  • w ConfigureServicesmetodzie przed wywołaniem services.AddMvc()dodaj:

     services.AddCors(options =>
        {
            options.AddPolicy("AllowAll",
                builder =>
                {
                    builder
                    .AllowAnyOrigin() 
                    .AllowAnyMethod()
                    .AllowAnyHeader()
                    .AllowCredentials();
                });
        });
  • (Ważne) W Configuremetodzie przed wywołaniem app.UseMvc()dodaj app.UseCors("AllowAll");

    AllowAllto nazwa zasady, którą musimy wspomnieć w app.UserCors. Może to być dowolne imię.


2
prawda, pomyślałem, że mogę włączyć tylko jedną z nich!
eugeneK

7
Dzięki. Miałem moje AddCory po UseMvc, co powodowało, że nie działało ono poprawnie. Twoja odpowiedź jest jedyną, która o tym wspomina.
JesseNewman19,

1
To nie działa, nie sądzę. Podając poświadczenia, nie możesz pozwolić na żadne pochodzenie. Nadal staram się, aby to zadziałało.
Jason Goemaat,

7
To jest kluczowy element: .UseCors()przed.UseMvc()
Neps

3
Zmarnowany czas na niewiedzę o UseCors przed UserMvc ... dzięki za pomoc!
Thomas

37

Na podstawie odpowiedzi Henka udało mi się wymyślić konkretną domenę, metodę, na którą chcę pozwolić, a także nagłówek, który chcę włączyć CORS dla:

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

stosowanie:

[EnableCors("AllowSpecific")]

To nie daje odpowiedzi na pytanie. Aby skrytykować lub poprosić autora o wyjaśnienia, zostaw komentarz pod postem.
zrvan

14
To critique or request clarification from an authorNie sądzę, żeby tak było w tym przypadku, a odpowiedź Henka została już zaznaczona. Moja odpowiedź była dodatkiem, jeśli chcesz zezwolić na określone domeny.
Oluwafemi,

W kodzie brakuje czegoś, „IServiceCollection” nie zawiera definicji „ConfigureCors”. Sprawdź to i spróbuj udzielić pełnej odpowiedzi.
Sami-L

@ Sami-L Proszę sprawdzić moją zaktualizowaną odpowiedź. Dowiedziałem się, że ConfigureCorszostał zmieniony na AddCors.
Oluwafemi,


7

Jeśli prowadzisz hosting w IIS, jednym z możliwych powodów jest to, że IIS blokuje OPTIONSczasownik. Z tego powodu spędziłem prawie godzinę:

Jednym z charakterystycznych wskazań jest 404błąd podczas OPTIONSżądania.

Aby to naprawić, musisz wyraźnie powiedzieć IIS, aby nie blokował OPTIONSżądania.

Przejdź do filtrowania żądań:

Filtrowanie żądań IIS

Upewnij się, że OPCJE są dozwolone:

Upewnij się, że OPCJE są prawdziwe

Lub po prostu utwórz web.configz następującym ustawieniem:

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

7

Musisz skonfigurować w klasie Startup.cs

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

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
Wspaniały sposób na obejście już wdrożonych zabezpieczeń przeglądarki. Po prostu nie!
JCKödel,

2
Nie sądzę, że należy to obniżyć. Jest to „alternatywny” sposób. Możesz albo użyć metody „UseCors ()”, albo dodać globalny filtr MVC, tak jak zrobił to tutaj Nathan.
Josh Mouch

działa to dla mnie na .net core 2.2 plus dodanie app UseCors („AllowAnyOrigin”); w metodzie „Konfiguruj”
Harry Sarshogh

Ważne jest, aby „dodać pakiet nuget Microsoft.AspNetCore.Cors do swojego projektu”. Dziękujemy za wzmiankę!
Mason Zhang,

5

Działa z .Net Core 3.1 w następujący sposób

1.Upewnij się, że umieścisz kod UseCors między app. UseRouting (); i app. UseAuthentication ();

        app.UseHttpsRedirection();

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

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

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

2. Następnie umieść ten kod w metodzie ConfigureServices

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

3. I powyżej kontrolera podstawowego umieściłem to

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

Teraz wszystkie moje kontrolery odziedziczą po BaseController i będą miały włączone CORS


Rzeczy nie działały dla mnie, dopóki japlace the UseCors code between app.UseRouting(); and app.UseAuthentication();
0014

1

Krok 1: Potrzebujemy pakietu Microsoft.AspNetCore.Cors w naszym projekcie. Aby zainstalować, przejdź do Narzędzia -> NuGet Package Manager -> Zarządzaj pakietami NuGet dla rozwiązania. Wyszukaj Microsoft.AspNetCore.Cors i zainstaluj pakiet.

Krok 2: Musimy wstrzyknąć CORS do pojemnika, aby mógł być wykorzystany przez aplikację. W klasie Startup.cs przejdźmy do metody ConfigureServices i zarejestrujmy CORS.

wprowadź opis zdjęcia tutaj

Tak więc w naszej aplikacji serwerowej przejdźmy do Kontrolery -> HomeController.cs i dodaj dekorator EnableCors do metody Index (lub konkretnego kontrolera i akcji):

wprowadź opis zdjęcia tutaj

Aby uzyskać więcej informacji kliknij tutaj


0

Wszystkie powyższe obejścia mogą działać lub mogą nie działać, w większości przypadków nie będą działać. Podałem rozwiązanie tutaj

Obecnie pracuję nad Angular i Web API (.net Core) i natknąłem się na problem CORS wyjaśniony poniżej

Powyższe rozwiązanie zawsze będzie działać. W przypadku żądania „OPCJE” naprawdę konieczne jest włączenie „Anonimowego uwierzytelnienia”. Dzięki wspomnianemu tutaj rozwiązaniu nie musisz wykonywać wszystkich wyżej wymienionych kroków, takich jak ustawienia IIS.

W każdym razie ktoś oznaczył mój powyższy post jako duplikat tego postu, ale widzę, że ten post służy tylko do włączenia CORS w ASP.net Core, ale mój post jest związany z, Włączanie i wdrażanie CORS w ASP.net Core i Angular.

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.