Skip to content

Route C: True Cross-Origin (CDN)

That blocked by CORS policy line in the browser console is something only this route actually runs into — the other two are same-origin, so CORS never enters the picture. Clearing it takes one change on each side; do only one and the console stays red.

Frontend: supply the API origin at build time. No API call has to change.

bash
VITE_API_BASE=https://api.example.com npm run build

Backend: allow that origin. It is deny-all by default, so leaving it unconfigured blocks every cross-origin request.

json
{
  "SmartAdmin": {
    "Api": {
      "Cors": {
        "AllowedOrigins": [ "https://admin.example.com" ],
        "AllowCredentials": true
      }
    }
  }
}

AllowedOrigins empty = no cross-origin requests are allowed; AllowCredentials only takes effect when origins is non-empty (there's no such thing as AllowAnyOrigin combined with credentials). The CORS policy is mounted automatically at the front of the pipeline by the kernel's IStartupFilteryou don't need to write UseCors yourself.

Images still break with CORS working. The signed direct link in viewUrl is a relative path (FileUrlSigner.BuildUrl), so cross-origin an <img src> resolves against the CDN, not the API domain, and every avatar and inline image is a dead link. Either have the CDN forward /api/* to the API origin, or swap IFileUrlSigner to emit absolute URLs.

Released under the Apache License 2.0