Files
AuditLogs/audit-logs
2025-03-06 09:58:05 +01:00
..
2025-03-05 21:48:39 +01:00
2025-03-06 09:58:05 +01:00
2025-03-06 09:58:05 +01:00

Integración de la Biblioteca AuditLogs

Configuración y Uso de AuditLogs

Este documento es una guia para la utilización de la biblioteca AuditLogs en aplicaciones .NET que requieren funcionalidades de auditoría mediante MongoDB.

Configuración Inicial

1. Configuración en appsettings.json

Agregue la siguiente configuración para la conexión a la base de MongoDB que usara la biblioteca, esto se pone en el archivo appsettings.json:

"DatabaseConfigurationAudit": {
    "ConnectionString": "mongodb://usuario:contraseña@host:puerto/?authSource=base_de_datos_autenticación",
    "DatabaseName": "AuditMeddisPlanUciPanel"
}

2. Instalación de la Biblioteca

Instale la biblioteca AuditLogs a través de NuGet con el siguiente comando:

dotnet add package AuditLogs

previamente se tuvo que haber configurado esta fuente https://smacs-nuget.epigramdev.com/v3/index.json

3. Configuración en Program.cs

Para configurar los servicios de la biblioteca en el archivo Program.cs, se debe incluir el espacio de nombres audit_logs.Extensions y ejecutar el método AddAuditServices:

using audit_logs.Extensions;

var builder = WebApplication.CreateBuilder(args);

// Configuración de servicios de auditoría
builder.Services.AddAuditServices(builder.Configuration);
builder.Services.AddHttpContextAccessor();

4. Modificación de la generación del token para incluir información (Opcional)

El servicio de autoría utiliza httpContext para extraer información del usuario que está haciendo los cambios, usted puede incluir más información si hace cambios en su modelo de usuario por ejemplo agregando un atributo Ip

using MongoDB.Bson;
namespace smacs_uci_api.Domain.Models.MongoModels
{ 
    public class User {
         public ObjectId Id { get; set; }
         public string Name { get; set; } = string.Empty;
         public string Email { get; set; } = string.Empty;
         public string IpAddress { get; set; } = string.Empty; 
         //otros datos 
    }
 }

Luego en la parte donde se hace la autenticación en este caso clase UserService puede modificar la creación del token para agregar esta información

 public TokenResult GenerateJwt(User user)
        {           
            // Claims basicos del usuario
            var claims = new List<Claim>
            {
                new Claim(ClaimTypes.Name, user.UserName),
                new Claim(ClaimTypes.Email, user.Email),
                new Claim("IpAddress", user.IpAddress)
            };

            // Agregar claims de autorizaciones utilizando ClaimsFromAuthorities
            claims.AddRange(ClaimsFromAuthorities(user.Authorization));
            
           // mas logica para este metodos...
            
            return new TokenResult
            {
                AccessToken = new JwtSecurityTokenHandler().WriteToken(accessToken),
                RefreshToken = new JwtSecurityTokenHandler().WriteToken(refreshToken),
                AccessTokenExpiryTime = accessToken.ValidTo,
                RefreshTokenExpiryTime = refreshToken.ValidTo,
                User = user
            };
        }
}

la biblioteca buscará el parámetro IpAddress y lo configura en el registro de autoría, si no se envia pondrá un valor por defecto

Uso en Servicios

Implemente IAuditService en los servicios donde se requiera registrar eventos de auditoría. El servicio de admisiones, por ejemplo, puede configurarse de la siguiente manera, donde se inyecta IAuditService y IHttpContextAccessor para registrar eventos de auditoría relacionados con las admisiones de pacientes:

Ejemplo en el Servicio de Admisiones

public class AdmissionService : IAdmissionService
{
    private readonly IAuditService _auditService;
    private readonly IHttpContextAccessor _httpContextAccessor;
    // Inyección de otros servicios necesarios...

    public AdmissionService(IAuditService auditService, IHttpContextAccessor httpContextAccessor, /* otros parámetros */)
    {
        _auditService = auditService;
        _httpContextAccessor = httpContextAccessor;
        // Inicialización de otros servicios...
    }

    public async Task AdmitPatient(Patient patient)
    {
        var httpContext = _httpContextAccessor.HttpContext;
        var insertedAdmission = /* lógica para admitir al paciente */;
        
        // Registro de evento de auditoría
        await _auditService.CreateAuditLogAsync(httpContext.User, null, insertedAdmission);
    }
}

Creación de Controladores de Consulta

Para crear un controlador que permita consultar los registros de auditoría, siga este ejemplo:

using audit_logs.Services.Interfaces;
using Microsoft.AspNetCore.Mvc;

namespace smacs_uci_api.Controllers
{
    [Route("Audit")]
    [ApiController]
    public class AuditController : ControllerBase
    {
        private readonly IAuditService _auditService;

        public AuditController(IAuditService auditService)
        {
            _auditService = auditService;
        }

        [HttpPost]
        public async Task<IActionResult> GetAuditRecordsByAnyTextField(
            [FromBody] audit_logs.Models.DTO.AuditLogTextOrDateSearchDTO auditRequestDto)
        {
            try
            {
                var result = await _auditService.GetAuditLogsMatchingTextOrDateAsync(auditRequestDto);
                return Ok(result);
            }
            catch (ArgumentException ex)
            {
                return BadRequest(ex.Message);
            }
        }
    }
}

Este controlador utiliza IAuditService para recuperar registros basados en texto y fechas especificadas por el usuario.