Nastavení CORS v Orchard Core

Jak zajistit bezpečnou komunikaci mezi různými zdroji v Orchard Core?

Problémy s CORS se nejčastěji projevují chybovými hláškami v konzoli prohlížeče. Pečlivě zkontrolujte nastavení CORS v administraci Orchard Core, ujistěte se, že povolené původy, metody a hlavičky přesně odpovídají požadavkům vaší aplikace. Také ověřte, že frontendová část aplikace volá API na správné adrese a s požadovanými parametry.

Zkroťte CORS v Orchard Core pomocí interního modulu

Detailní pohled na modul OrchardCore.Cors. Ukážeme si, jak nastavit Cross-Origin politiky přímo z Administrace, vyhnout se bezpečnostním pastem a hladce napojit moderní frontendy.

Klíčové shrnutí: CORS (Cross-Origin Resource Sharing) je bezpečnostní mechanismus prohlížečů uvolňující restrikce Same-Origin Policy. Modul OrchardCore.Cors umožňuje tuto konfiguraci abstrahovat do Administračního UI (nebo appsettings.json) na úrovni jednotlivých tenantů. Správné nastavení je kritické pro headless přístup a integraci komplexních UI knihoven (např. Syncfusion), přičemž nejčastější chybou je kombinace AllowAnyOrigin a AllowCredentials, kterou ASP.NET Core z bezpečnostních důvodů (OWASP) tiše ignoruje.

Co je to CORS a jaký obchodní problém řeší?

Pokud vaše tvorba webových stránek směřuje k moderní architektuře odděleného frontendu (Decoupled/Headless), váš backend (Orchard Core API) a frontend (např. React, MAUI Blazor) pravděpodobně běží na různých doménách nebo portech. Prohlížeče z bezpečnostních důvodů aplikují Same-Origin Policy, což znamená, že skripty z domény A nesmí číst data z domény B.

CORS (Cross-Origin Resource Sharing) je mechanismus využívající HTTP hlavičky, který serveru umožňuje explicitně říct prohlížeči: "Aplikaci běžící na této cizí doméně důvěřuji, povol jí přístup k mým datům." Bez CORS je modernizace legacy systémů na API-first přístup nemožná, protože vaše SPA (Single Page Application) narazí na červenou chybu v konzoli hned při prvním fetch() dotazu.

Aktivace a konfigurace modulu OrchardCore.Cors

Místo psaní vlastního middleware kódu nabízí Orchard Core elegantní multi-tenant řešení. Modul plně obaluje nativní infrastrukturu ASP.NET Core a přidává jí dynamičnost. Při vývoji modulů na míru tak můžete využívat centrální nastavení.

Metoda 1: Konfigurace skrze Administrační UI

Největší výhodou modulu je možnost spravovat CORS bez nutnosti nasazování nového kódu. To je ideální pro rychlé úpravy v produkci.

  1. V administraci přejděte do Configuration -> Features.
  2. Vyhledejte CORS Configuration a modul aktivujte.
  3. Následně jděte do Configuration -> Settings -> CORS a klikněte na Add a policy.

1. Podrobnosti (Název a výchozí stav)

  • Název zásady (Policy Name): Identifikátor politiky. Pokud máte v systému více specifických endpointů (např. jeden pro veřejný web, druhý pro interní B2B portál), můžete si definovat více politik.
  • Nastavit jako výchozí zásady (Is Default Policy): Pokud toto zaškrtnete, Orchard Core aplikuje tuto politiku automaticky na všechny HTTP požadavky daného tenanta, aniž byste museli API kontrolery explicitně dekorovat atributem [EnableCors].

2. Přihlašovací údaje (Credentials)

  • Allow credentials: Kritické nastavení! Zaškrtnutím tohoto pole (.AllowCredentials()) sdělujete prohlížeči, že smí odesílat citlivá data (cookies, HTTP autentizační hlavičky, TLS klientské certifikáty). Je to nezbytné pro přihlášené uživatele ve vaší SPA aplikaci.
  • 🛑 Zásadní úskalí: Jak je uvedeno přímo v nápovědě UI na obrázku: "This setting is not allowed in combination with Allow Any Origin." Pokud povolíte credentials, ASP.NET Core z důvodu ochrany proti útokům (OWASP) striktně vyžaduje explicitně vyjmenované domény. Pokud byste zaškrtli obojí, Orchard Core politiku tiše ignoruje a komunikace spadne!

3. Původy (Origins)

  • Povolit libovolný původ (Allow Any Origin): Rychlá cesta pro veřejná API (např. veřejná data o počasí). Povoluje přístup odkudkoliv (hodnota *). V enterprise vývoji se tomuto nastavení u produkčních dat vyhýbáme.
  • Allowed origins: Tlačítkem "Přidat Původ" definujete seznam důvěryhodných URL adres vašich frontendových aplikací (např. https://moje-appka.cz). Tip: Nikdy neuvádějte lomítko na konci adresy, prohlížeč hlavičku Origin odesílá vždy bez něj.

4. Hlavičky (Headers)

  • Řídí hlavičky posílané od klienta k serveru (např. Authorization, Content-Type). Běžně se zaškrtává Povolit libovolné hlavičky pro usnadnění vývoje, případně přes "Přidat Hlavička" přesně specifikujete, co váš backend smí akceptovat.

5. Metody (Methods)

  • Řídí, jaké HTTP akce smí frontend provést (GET, POST, PUT, DELETE). Opět lze zaškrtnout Povolit libovolnou metodu. Pokud ale tvoříte striktní REST API jen pro čtení (Read-Only), definujte zde pouze GET a OPTIONS. Zvyšuje to celkovou bezpečnost.

6. Exposed headers (Vystavené hlavičky)

  • Zde nastavujete hlavičky posílané od serveru ke klientovi, které má prohlížeč dovolit vašemu JavaScriptu přečíst. Ve výchozím stavu prohlížeč zpřístupní pouze základní hlavičky (tzv. CORS-safelisted). Všechno ostatní, i když to server pošle, před frontendovým kódem skryje.

Akce ve formuláři Generovaný kód (ASP.NET Core ekvivalent) Dopad na bezpečnost
Zaškrtnutí "Allow credentials" builder.AllowCredentials(); Kritické pro Session/OAuth. Vystavuje riziku CSRF, pokud není správně nastaven Origin.
Zaškrtnutí "Povolit libovolný původ" builder.AllowAnyOrigin(); Extrémní benevolentnost. Vhodné pouze pro public Open Data API.
Vyplnění "Exposed headers" builder.WithExposedHeaders("..."); Bezpečné a nezbytné pro custom logiku frontendu (např. stahování Syncfusion reportů, Paginace z hlaviček).
⚠️ Kritické úskalí: Zrádná kombinace v zabezpečení
Dokumentace Orchard Core varuje: "Použití AllowCredentials a AllowAnyOrigin současně je považováno za bezpečnostní riziko. Politiky obsahující OBĚ tyto možnosti NEBUDOU aktivovány." Pokud v UI zaškrtnete obojí, ASP.NET Core z důvodu ochrany proti CSRF útokům konfiguraci potichu zahodí. Vždy musíte explicitně vypsat Allowed Origins, pokud vyžadujete credentials!

Metoda 2: Přes appsettings.json (Pro CI/CD a Enterprise)

Pokud stavíte enterprise CMS řešení, doporučuji držet konfiguraci v kódu. Modul plně reflektuje nastavení z konfigurace tenanta.

{
  "OrchardCore": {
    "OrchardCore_Cors": {
      "Policies": {
        "DefaultCorsPolicy": {
          "AllowedOrigins": [ "https://localhost:7153", "https://app.klient.cz" ],
          "AllowAnyMethod": true,
          "AllowAnyHeader": true,
          "AllowCredentials": true,
          "ExposedHeaders": [ "Content-Disposition" ],
          "IsDefaultPolicy": true
        }
      }
    }
  }
}

Klady UI Konfigurace

Okamžitá aplikace změn bez nutnosti restartovat aplikaci nebo nasazovat nový build. Extrémně flexibilní pro multi-tenant architekturu, kde má každý klient vlastní povolené domény.

Možná Úskalí

Pokud vývojáři zapomenou zrcadlit produkční UI nastavení do lokálního prostředí, vznikají nesrovnalosti. Riziko špatně napsané URL adresy (překlepy, http vs https) zablokuje API.

💡 Tip: Synergie se Syncfusion ušetří stovky hodin
Výkonné komponenty z rodiny Syncfusion (jako DataManager, Blazor DataGrid nebo Scheduler) jsou pro headless systémy požehnáním, protože obsahují vestavěné WebApi adaptéry, čímž zásadně zkracují vývoj webových aplikací. Pokud však propojujete API Orchard Core se Syncfusion Document Solutions (pro programové generování PDF/Excel reportů na backendu a jejich zaslání na frontend), musíte v CORS politice v Exposed Headers definovat hodnotu Content-Disposition. Bez toho Syncfusion na frontendu nedokáže z HTTP odpovědi přečíst název vygenerovaného souboru a stahování selže na nativní ochraně prohlížeče!

Často kladené otázky (FAQ)

Proč zvolit OrchardCore pro tvorbu webu a headless API?
Orchard Core nenabízí jen GraphQL z krabice, ale i robustní multi-tenancy a abstrakci nad middlewary jako je CORS. O každého klienta se postaráte odděleně bez nutnosti hardcodovat politiky do Program.cs.
Jak Syncfusion zkracuje vývoj modulů a administrací?
Jakmile úspěšně vyřešíte CORS, Syncfusion DataGrid napojený na váš Orchard REST endpoint okamžitě zvládá server-side stránkování, filtrování a CRUD operace. Ušetříte desítky hodin psaní JavaScriptového boilerplate kódu pro manipulaci s daty.

Narazili jste při konfiguraci CORS v Orchard Core na blokaci ze strany prohlížeče, nebo bojujete s integrací klientských aplikací? Napište mi. Architektura má být elegantní, ne bolestivá.

Doporučené příspěvky