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
| Composant | Description |
|---|---|
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 :
- Les projets Contracts (DTOs, interfaces, events)
- 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
internalpar defaut. - Seuls les types dans
.Contractssontpublic. InternalsVisibleToest utilise uniquement pour les projets de test du meme module.
Securite
JWT et gestion des tokens
| Aspect | Implementation | Point de vigilance |
|---|---|---|
| Algorithme de signature | RS256 (cle privee RSA) | Ne jamais exposer la cle privee |
| Cle publique | Exposee via /.well-known/jwks.json | Cle utilisee pour la verification cote client |
| Duree access token | 60 min (configurable) | Un compromis entre securite et UX |
| Duree refresh token | 30 jours (43200 min) | Stockage securise cote client obligatoire |
| Rotation des tokens | Chaque refresh emet un nouveau token | L'ancien token est invalide immediatement |
| Detection de replay | PreviousRefreshTokenHash conserve | Si replay detecte, toutes les sessions sont revoquees |
| Pepper des refresh tokens | REFRESH_TOKEN_PEPPER dans .env | Ne jamais committer ce secret |
Gestion des sessions
| Aspect | Configuration |
|---|---|
| Max sessions actives | 5 (configurable via SessionOptions) |
| Session binding IP | Active par defaut (EnforceSessionBinding) |
| Retention | 30 jours |
| Nettoyage automatique | Chaque heure |
| Metadonnees device | IP, User-Agent, Device Type, Browser, OS |
Politique de mots de passe
| Parametre | Valeur par defaut | Description |
|---|---|---|
MinLength | 8 | Longueur minimale |
HistoryCount | 5 | Nombre de mots de passe en historique |
PasswordExpiryDays | 90 | Expiration du mot de passe |
EnforcePasswordExpiry | true | Forcer le renouvellement |
OTP (One-Time Password)
| Parametre | Valeur | Description |
|---|---|---|
Length | 6 | Longueur du code OTP |
ExpiryMinutes | 5 | Duree de validite |
MaxAttempts | 3 | Nombre maximum de tentatives |
Anti-enumeration
Tous les endpoints sensibles retournent des reponses generiques pour empecher l'enumeration des utilisateurs :
POST /forgot-password: Toujours 200 OKPOST /confirm-email: Toujours 200 OKPOST /resend-confirmation: Toujours 200 OKPOST /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
- Toujours creer les migrations dans le bon module en specifiant
--contextet--project. - Ne jamais modifier une migration deja appliquee en production.
- Tester les migrations dans un environnement de staging avant la production.
- Les migrations sont appliquees automatiquement au demarrage via
IStartupTask.
Ordre d'execution
L'ordre de demarrage des taches est important :
- Migrations de la base Identity
- Seed des donnees (roles, admin)
- Migrations des autres modules (Audit, Messaging)
- 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
| Fichier | Raison |
|---|---|
.env | Contient les secrets de production |
| Cle privee RSA | Signature des JWT |
appsettings.Production.json | Configuration de production |
Variables d'environnement critiques
| Variable | Impact si compromis |
|---|---|
JWT_PRIVATE_KEY_BASE64 | Permet de forger des tokens d'acces valides |
REFRESH_TOKEN_PEPPER | Permet de reconstruire des refresh tokens |
DATABASE_CONNECTION_STRING | Acces direct a la base de donnees |
SNS_SECRET_ACCESS_KEY | Permet d'envoyer des SMS via le compte AWS |
SMTP_PASSWORD | Acces 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
Versionest incremente automatiquement a chaqueSaveChangesAsync. - Les entites implementant
IVersionsuivent le meme pattern.
Idempotence
Certains endpoints supportent l'idempotence via le header Idempotency-Key :
POST /registerPOST /reset-passwordPOST /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-Forsi derriere un proxy). - La configuration
ForwardedHeadersTrustOptionsdoit 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)
| Parametre | Valeur par defaut | Description |
|---|---|---|
| Dashboard | /hangfire | Interface d'administration |
| Worker count | 8 | Nombre de workers |
| Queue poll interval | 15s | Intervalle de polling |
| Outbox dispatch | */15 * * * * | Cron pour dispatch outbox |
Le dashboard Hangfire est accessible en developpement. En production, securiser l'acces.