Actividad #26 » Configuración de Seguridad API REST.md
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:
-
HTTPS-forzado
Cualquier petición HTTP recibida será redirigida automáticamente a HTTPS, evitando que los datos circulen en texto plano. -
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 yCreated
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();
}
}
}