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.