Esta é uma postagem rápida sobre como implementar trilha de auditoria no .NET 6 utilizando o Entity Framework Core.
Uma trilha de auditoria é um registro de todas as ações, eventos ou atividades que um usuário ou sistema realizou com seus dados. Assim, pode estar relacionado à criação, modificação, exclusão de registros ou pode ser uma sequência de ações automatizadas do sistema.
No Entity Framework Core, a auditoria de entidade pode ser facilmente configurada substituindo o método SaveChanges. O rastreamento dessas alterações de dados é crucial para a segurança e integridade de qualquer aplicação.
Pré-requisitos
- Visual Studio 2022 (.NET 6.0)
- SQL Express
- Nuget package Microsoft.AspNetCore.Identity.EntityFrameworkCore, Serilog.AspNetCore
API
O primeiro passo é criar a entidade de auditoria responsável por coletar todas as modificações realizadas no banco de dados.
A classe Audit é a representação da tabela de auditoria no banco de dados e a classe AuditEntry é responsável por criar e padronizar o objeto de auditoria.
Por questões de performance, é importante configurar todos os campos textos como varchar no banco de dados. Veja aqui as dicas de performance no blog do Dirceu Resende.
Em seguida, é hora de configurar o contexto da aplicação.
- A interface IHttpContextAccessor é responsável por obter o usuário credenciado na aplicação.
- Audits, Companies, Users e Roles são as entidades do banco de dados. Em Audits serão gravadas todas as auditorias das entidades.
- O método OnModelCreating() é responsável por configurar o schema e aplicar as configurações das tabelas no banco de dados.
- Os métodos SaveChanges() e SaveChangesAsync() são responsáveis por persistirem todas as modificações no banco de dados.
- O método BeforeSaveChanges() é responsável por coletar todas as modificações nas entidades referentes à criação, alteração e exclusão de registros na base.
Na classe Program.cs da API, é necessário criar a conexão com o banco SQL e iniciar as migrations do projeto para criação das tabelas. Configure a chave de conexão com o banco SQL no arquivo appsettings.json, neste exemplo é utilizado o SQL Express:
"Data Source=.\SQLEXPRESS;Database=sample-audit;Integrated Security=True;MultipleActiveResultSets=true;"
E finalizando, vamos criar a controller CompanyController realizando a inclusão e alteração de registros.
Testando
Para realizar os testes, execute o endpoint POST /company e PUT /company no Swagger para a criação e alteração de um registro.
A tabela AuditLogs registra todas as auditorias em formato JSON.
Dicas
Para não demandar muita escrita do banco de dados transacional salvando logs de auditorias, é uma boa prática trabalhar com eventos utilizando um Message Broker. Neste caminho, é necessário apenas modificar o método BeforeSaveChanges do contexto configurando o envio de eventos de auditoria ao invés de gravar no banco de dados.
Para saber mais sobre envio de eventos, acesse este artigo que criei utilizando o Azure Service Bus.
Finalizando
Neste artigo, aprendemos como implementar a trilha de auditoria com o Entity Framework Core utilizando o .NET 6. Essa prática é bastante útil quando você começa a trabalhar com aplicações que são utilizados por vários usuários, onde é necessário inspecionar e controlar todas as alterações realizadas no banco de dados.
Os detalhes completos deste exemplo você encontra no meu GitHub: https://github.com/hgmauri/sample-audit-entityframework