DEV Community

Tobias Mesquita for Quasar Framework Brasil

Posted on

QPANC - Parte 8 - ASP.NET - CORS

QPANC são as iniciais de Quasar PostgreSQL ASP NET Core.

14 Ativando o CORS

Por enquanto, nós testamos a API usando o Swagger, que é executado do mesmo domínio, porém o app feito usando o Quasar será executado de outro domínio, especialmente.

O primeiro passo, é adicionar o serviço que irá ler as configurações relativas ao CORS.:

QPANC.Services.Abstract/Business/ICors.cs

namespace QPANC.Services.Abstract
{
    public interface ICors
    {
        string[] Hosts { get; }
    }
}

QPANC.Services/Business/Cors.cs

using Microsoft.Extensions.Configuration;
using QPANC.Services.Abstract;
using IConfiguration = QPANC.Services.Abstract.IConfiguration;

namespace QPANC.Services
{
    public class Cors : ICors
    {
        private IConfiguration _configuration;

        public Cors(IConfiguration configuration)
        {
            this._configuration = configuration;
        }

        public string[] Hosts
        { 
            get 
            {
                var hosts = this._configuration.Root
                    .GetSection("CORS_HOSTS")
                    .AsEnumerable()
                    .Select(pair => pair.Value)
                    .Where(value => !string.IsNullOrWhiteSpace(value))
                    .ToArray();
                return hosts ;
            }
        }
    }
}

Agora, adicione a respectiva variável de ambiente ao docker-compose.override.yml

services:
  qpanc.api:
    environment:
      - CORS_HOSTS__0=localhost

caso precise permitir múltiplos domínios, adicione as variáveis CORS_HOSTS__1, CORS_HOSTS__2 até a CORS_HOSTS__n.

Enquanto estamos desenvolvendo, iremos liberar apenas o localhost.

Claro, deverá adicionar o QPANC.Services.Abstract.ICors ao QPANC.Services.Abstract.IAppSettings e o QPANC.Services.Cors ao QPANC.Services.AppSettings.

Assim como adicionar services.AddSingleton<ICors, Cors>(); ao QPANC.Api.Extensions.ServiceCollectionExtensions.

Agora, precisamos criar um arquivo de options para a configuração do Cors:

QPANC.Api/Options/Cors.cs

using Microsoft.AspNetCore.Cors.Infrastructure;
using Microsoft.Extensions.Options;
using QPANC.Services.Abstract;
using System;
using System.Linq;

namespace QPANC.Api.Options
{
    public class Cors : IConfigureOptions<CorsOptions>
    {
        private ICors _settings;

        public Cors(ICors settings)
        {
            this._settings = settings;
        }

        public void Configure(CorsOptions options)
        {
            options.AddDefaultPolicy(builder =>
            {
                builder
                    .SetIsOriginAllowed(url => {
                        var host = new Uri(url).Host;
                        return this._settings.Hosts.Contains(host);
                    })
                    .AllowAnyMethod()
                    .AllowAnyHeader()
                    .AllowCredentials();
            });
        }
    }
}

Por fim, precisamos aplicar esta configuração no Startup:

QPANC.API/Startup.cs

namespace QPANC.Api
{
    public class Startup
    {
        public Startup(IConfiguration configuration)
        {
            Configuration = configuration;
        }

        public void ConfigureServices(IServiceCollection services)
        {
            services.ConfigureOptions<Options.Cors>();
        }

        public void Configure(IApplicationBuilder app, IWebHostEnvironment env, ISeeder seeder)
        {
            app.UseCors();
        }
    }
}

Com isto, dou por finalizado a parte referente ao ASP.NET Core, assim podemos voltar a nossa atenção para o Quasar.

Billboard image

The Next Generation Developer Platform

Coherence is the first Platform-as-a-Service you can control. Unlike "black-box" platforms that are opinionated about the infra you can deploy, Coherence is powered by CNC, the open-source IaC framework, which offers limitless customization.

Learn more

Top comments (0)

Sentry image

See why 4M developers consider Sentry, “not bad.”

Fixing code doesn’t have to be the worst part of your day. Learn how Sentry can help.

Learn more

👋 Kindness is contagious

Please leave a ❤️ or a friendly comment on this post if you found it helpful!

Okay