Points d'attention

Zones critiques du code, regles de securite, contraintes de modification et points de vigilance pour les developpeurs.

Points d'attention

Protection des BuildingBlocks

Le dossier src/BuildingBlocks/ contient le code partage par tous les modules. Toute modification de BuildingBlocks a un impact sur l'ensemble de l'application.

Regles

  • Ne jamais modifier src/BuildingBlocks/ sans approbation explicite.
  • Preferer les methodes d'extension ou les abstractions au niveau du module.
  • Si une modification est necessaire, documenter l'impact et tester tous les modules affectes.

Composants BuildingBlocks

ComposantDescription
Core/CQRS/ICommand<T>, IQuery<T>, handlers (MediatR wrappers)
Web/IMinimalEndpoint, helpers d'enregistrement
EFCore/AppDbContextBase, utilitaires DbContext
Validation/Pipeline MediatR pour FluentValidation
TestBase/Fixtures de test d'integration
Constants/Constantes partagees (IdentityConstant.Role.Admin)
BackgroundJobs/Integration Hangfire
OpenApi/Configuration Swagger/Scalar

Frontieres des modules

Principe fondamental

Les modules communiquent uniquement via :

  1. Les projets Contracts (DTOs, interfaces, events)
  2. Les MediatR Notifications (evenements in-process)

A ne jamais faire

// INTERDIT : reference directe aux types internes d'un autre module
using Identity.Persistence;
using Identity.Entities;
using Audit.Services;

Approche correcte

// CORRECT : reference au projet Contracts
using Identity.Contracts;
using Identity.Contracts.IntegrationEvents;

Visibilite des types

  • Les types de module sont internal par defaut.
  • Seuls les types dans .Contracts sont public.
  • InternalsVisibleTo est utilise uniquement pour les projets de test du meme module.

Securite

JWT et gestion des tokens

AspectImplementationPoint de vigilance
Algorithme de signatureRS256 (cle privee RSA)Ne jamais exposer la cle privee
Cle publiqueExposee via /.well-known/jwks.jsonCle utilisee pour la verification cote client
Duree access token60 min (configurable)Un compromis entre securite et UX
Duree refresh token30 jours (43200 min)Stockage securise cote client obligatoire
Rotation des tokensChaque refresh emet un nouveau tokenL'ancien token est invalide immediatement
Detection de replayPreviousRefreshTokenHash conserveSi replay detecte, toutes les sessions sont revoquees
Pepper des refresh tokensREFRESH_TOKEN_PEPPER dans .envNe jamais committer ce secret

Gestion des sessions

AspectConfiguration
Max sessions actives5 (configurable via SessionOptions)
Session binding IPActive par defaut (EnforceSessionBinding)
Retention30 jours
Nettoyage automatiqueChaque heure
Metadonnees deviceIP, User-Agent, Device Type, Browser, OS

Politique de mots de passe

ParametreValeur par defautDescription
MinLength8Longueur minimale
HistoryCount5Nombre de mots de passe en historique
PasswordExpiryDays90Expiration du mot de passe
EnforcePasswordExpirytrueForcer le renouvellement

OTP (One-Time Password)

ParametreValeurDescription
Length6Longueur du code OTP
ExpiryMinutes5Duree de validite
MaxAttempts3Nombre maximum de tentatives

Anti-enumeration

Tous les endpoints sensibles retournent des reponses generiques pour empecher l'enumeration des utilisateurs :

  • POST /forgot-password : Toujours 200 OK
  • POST /confirm-email : Toujours 200 OK
  • POST /resend-confirmation : Toujours 200 OK
  • POST /otp/resend : Toujours 200 OK

Headers de securite

L'application injecte systematiquement les headers suivants :

X-Content-Type-Options: nosniff
X-Frame-Options: DENY
Referrer-Policy: strict-origin-when-cross-origin
Permissions-Policy: camera=(), microphone=(), geolocation=()
Content-Security-Policy: default-src 'self'; frame-ancestors 'none'

Gestion des migrations de base de donnees

Regles

  1. Toujours creer les migrations dans le bon module en specifiant --context et --project.
  2. Ne jamais modifier une migration deja appliquee en production.
  3. Tester les migrations dans un environnement de staging avant la production.
  4. Les migrations sont appliquees automatiquement au demarrage via IStartupTask.

Ordre d'execution

L'ordre de demarrage des taches est important :

  1. Migrations de la base Identity
  2. Seed des donnees (roles, admin)
  3. Migrations des autres modules (Audit, Messaging)
  4. Demarrage de Hangfire

Rollback

EF Core ne fournit pas de rollback automatique en production. Preparer des scripts de rollback manuels pour les migrations complexes.


Configuration sensible

Fichiers a ne jamais committer

FichierRaison
.envContient les secrets de production
Cle privee RSASignature des JWT
appsettings.Production.jsonConfiguration de production

Variables d'environnement critiques

VariableImpact si compromis
JWT_PRIVATE_KEY_BASE64Permet de forger des tokens d'acces valides
REFRESH_TOKEN_PEPPERPermet de reconstruire des refresh tokens
DATABASE_CONNECTION_STRINGAcces direct a la base de donnees
SNS_SECRET_ACCESS_KEYPermet d'envoyer des SMS via le compte AWS
SMTP_PASSWORDAcces au serveur email

Concurrence et versioning

Concurrency token

L'entite User utilise le champ Version comme concurrency token EF Core. Cela signifie :

  • Toute modification concurrente d'un meme utilisateur leve une DbUpdateConcurrencyException.
  • Le champ Version est incremente automatiquement a chaque SaveChangesAsync.
  • Les entites implementant IVersion suivent le meme pattern.

Idempotence

Certains endpoints supportent l'idempotence via le header Idempotency-Key :

  • POST /register
  • POST /reset-password
  • POST /social (login social)

L'entite IdempotencyRecord stocke les resultats des requetes precedentes avec une date d'expiration.


Rate limiting

Le rate limiting est configure par politique. Un depassement retourne 429 Too Many Requests.

Points de vigilance :

  • Les politiques sont par IP source (via X-Forwarded-For si derriere un proxy).
  • La configuration ForwardedHeadersTrustOptions doit correspondre a l'infrastructure de deploiement.
  • En mode cluster, le rate limiting in-memory ne partage pas l'etat entre instances (Redis necessaire pour le scaling).

Observabilite

OpenTelemetry

L'application expose des metriques et des traces via OpenTelemetry :

{
  "ObservabilityOptions": {
    "InstrumentationName": "place-api",
    "MetricsEnabled": true,
    "TracingEnabled": true,
    "UsePrometheusExporter": true
  }
}

Audit HTTP Middleware

Un middleware d'audit capture automatiquement les requetes/reponses HTTP :

  • Corps limites a 2048 octets
  • Types de contenu captures : application/json, application/problem+json
  • Chemins exclus : /health, /alive, /metrics, /hangfire

Background Jobs (Hangfire)

ParametreValeur par defautDescription
Dashboard/hangfireInterface d'administration
Worker count8Nombre de workers
Queue poll interval15sIntervalle de polling
Outbox dispatch*/15 * * * *Cron pour dispatch outbox

Le dashboard Hangfire est accessible en developpement. En production, securiser l'acces.