Proyecto

General

Perfil

Actividad #26 » Configuración de Seguridad API REST.md

Reynaldo León, 04/08/2025 03:57

 

Informe de Seguridad – API REST del subdominio Integraciones

Objetivo

Cumplir “proteger la API con autenticación OAuth 2.0 sobre TLS 1.3 y rechazar peticiones sin token válido”.

Conexiones HTTPS/TLs 1.3:

Se han añadido dos elementos de seguridad de transporte:

  1. HTTPS-forzado
    Cualquier petición HTTP recibida será redirigida automáticamente a HTTPS, evitando que los datos circulen en texto plano.

  2. TLS 1.3 obligatorio
    Se asegura que la única versión de TLS permitida sea 1.3, lo que proporciona:

    • Cifrado más fuerte (AEAD únicamente).

    • Handshake más rápido (menos ida y vuelta).

    • Eliminación de vulnerabilidades asociadas a TLS 1.0/1.1/1.2.


builder.Services.AddHttpsRedirection(options =>
{
    options.HttpsPort = 44362;
});

builder.WebHost.ConfigureKestrel(options =>
{
    options.ConfigureHttpsDefaults(https =>
    {
        https.SslProtocols = SslProtocols.Tls13;
    });
});

En conjunto, estas líneas cumplen con el requisito de proteger la API mediante conexiones HTTPS/TLS 1.3 y rechazar tráfico inseguro.

OAuth 2.0

Nota: Por default el proyecto ABP ya implementar este tipo de protecciones

Ejemplo de la aplicación de OAuth 2.0

1. Se ha creado la entidad Test como Agregado Raíz (AggregateRoot<Guid>) para que:
  • ABP genere automáticamente el repositorio, el servicio CRUD y el endpoint REST.

  • Se integre sin esfuerzo con el sistema de migraciones y auditoría.

  • El campo Name almacene información descriptiva y Created permita rastreabilidad temporal.

  • Se encuentra en el directorio: "...CRM\CRM.MVC.Capacitacion\src\CRM.MVC.Capacitacion.Domain\Entities"

using System;
using Volo.Abp.Domain.Entities;

namespace CRM.MVC.Capacitacion.Entities
{
    public class Test : AggregateRoot<Guid>
    {
        public string Name { get; set; }
        public DateTime Created {  get; set; }
    }
}

Esta clase servirá como modelo de dominio que se persistirá en la tabla Test cifrada con TDE (TLS 1.3 + keyring_file) y se expondrá luego mediante la API REST.


2. Se añade la propiedad Tests al CapacitacionDbContext.cs para registrar la entidad Test en el modelo de EF Core. Esto es imprescindible para que:
  • La migración genere la tabla Test con cifrado TDE (ya configurado).

  • ABP pueda resolver automáticamente IRepository<Test, Guid> y exponer el endpoint REST.

  • Se encuentra en el directorio: "...CRM\CRM.MVC.Capacitacion\src\CRM.MVC.Capacitacion.EntityFrameworkCore\EntityFrameworkCore\CapacitacionDbContext.cs"

using CRM.MVC.Capacitacion.Entities;

...
public DbSet <Test> Tests { get; set; }
...

3. Se crea TestDto, un objeto de transferencia pensado para:
  • Serializar/deserializar datos en las peticiones y respuestas de la API sin exponer la entidad de dominio.

  • Facilitar la validación, mapeo y transformación de datos en los servicios de aplicación.

  • Mantener la capa de dominio desacoplada de la infraestructura (EF Core) y del contrato de la API.

  • Se encuentra en el directrio: "...CRM\CRM.MVC.Capacitacion\src\CRM.MVC.Capacitacion.Application.Contracts\Services\TestDto.cs"

using System;

namespace CRM.MVC.Capacitacion.Services
{
    public class TestDto
    {
        public Guid Id { get; set; }
        
        public string Name { get; set; }
        
        public DateTime Created { get; set; }
    }
}

4. Esta interfaz actúa como contrato público entre la capa de presentación (API) y la lógica de negocio. Al implementarla ABP:
  • Expone automáticamente el endpoint REST GET /api/app/test.

  • Inyecta y gestiona la instancia mediante DI sin más configuración.

  • Se encuentra en el directorio: "...CRM\CRM.MVC.Capacitacion\src\CRM.MVC.Capacitacion.Application.Contracts\Services\ITestAppService.cs"

using System.Collections.Generic;
using System.Threading.Tasks;
using Volo.Abp.Application.Services;

namespace CRM.MVC.Capacitacion.Services
{
    public interface ITestAppService : IApplicationService
    {
        Task<List<TestDto>> GetAllAsync();
    }
}

5. Esta clase es la implementación real del contrato ITestAppService.

Utiliza el patrón Repository + DTO para:

  • Aislar la lógica de acceso a datos (repositorio).

  • Exponer únicamente los campos que la API debe devolver.

  • Permitir que ABP genere automáticamente el endpoint REST /api/app/test sin escribir controladores ni SQL manual.

  • Se encuentra en el directorio: "...CRM\CRM.MVC.Capacitacion\src\CRM.MVC.Capacitacion.Application\Services\TestAppService.cs"

using System.Text;
using System.Threading.Tasks;
using CRM.MVC.Capacitacion.Entities;
using Volo.Abp.Application.Services;
using Volo.Abp.Domain.Repositories;

namespace CRM.MVC.Capacitacion.Services
{
	[Authorize(IdentityPermissions.Roles.Default)]
    public class TestAppService : ApplicationService, ITestAppService
    {
        private readonly IRepository<Test, Guid> _repository;

        public TestAppService(IRepository<Test, Guid> repository)
        {
            _repository = repository;
        }

        public async Task<List<TestDto>> GetAllAsync()
        {
            var items = await _repository.GetListAsync();
            return items.Select(x => new TestDto
            {
                Id = x.Id,
                Name = x.Name,
                Created = x.Created,
            }).ToList();
        }
    }
}
    (1-1/1)