Перейти к основному содержимому

ADR-0044: Audit.NET для Admin API и Resilience Policies

Статус

Принято.

Контекст

Аудит

Admin API выполняет чувствительные операции: одобрение KYC, ручная корректировка баланса, изменение лимитов operational safety, просмотр PII. Существующий AuditBehavior в MediatR pipeline фиксирует только факт вызова команды. Для compliance и regulatory evidence необходим детальный аудит: request/response body, before/after state EF entities, actor snapshot, duration.

Resilience

Pin интегрируется с 10+ external providers. Без resilience политик единственный недоступный провайдер (KYC, SMS, payment) роняет весь API или создаёт неконтролируемый cascade failure.

Решение

Аудит

Audit.NET (thepirat000) как декларативный audit framework для admin API:

  • [AuditApiAction("event-type")] на admin controller actions с mutation (PUT/POST/DELETE/PATCH).
  • AuditDbContext как base для admin DbContext — фиксирует EF INSERT/UPDATE/DELETE с before/after.
  • DataProvider: PostgreSQL schema audit, append-only table audit_events.
  • Маскирование PII и secrets перед записью через AuditSensitiveMasker.
  • Retention: 2 года (vs Serilog logs: 30 дней).

Audit.NET дополняет, а не заменяет MediatR AuditBehavior:

  • MediatR: command name, actor, success/fail — легковесно, все сервисы.
  • Audit.NET: full request body, EF changes, response — только admin API.

Resilience

Microsoft.Extensions.Http.Resilience + Polly v8:

  • Named pipeline profiles: external-provider (retry 3x exponential + circuit breaker + 10s timeout), internal-service (retry 2x + 5s timeout).
  • Декоратор ResilientPortDecorator через Scrutor для application ports к external providers.
  • DistributedJobRunner использует retry-механизм для database-level job scheduling.

Последствия

  • Каждое изменение в admin API оставляет полный audit trail с before/after state.
  • Провал одного external provider не роняет остальные операции — circuit breaker изолирует.
  • [AuditApiAction] обязателен для всех admin mutation endpoints.
  • Audit storage отделён от operational schema.

Ссылки

Обратные ссылки

Автоссылки: где используется этот документ.