Isolation multi-tenant
Global Query Filters EF Core, claims JWT par tenant, RBAC entity-level sur Admin, Manager et Collaborateur. Aucune donnée ne franchit une frontière de tenant.
EF Core · JWT · RBAC
Lire l’étude de cas01 / Ingénieur logiciel
Développeur Fullstack .NET
Architecture SaaS multi-tenant
Je construis la couche invisible des plateformes SaaS — celle que les utilisateurs ne remarquent jamais, sauf quand elle manque.
02 / Approche
Aucune requête ne franchit une frontière de tenant.
Global Query Filters EF Core et claims JWT par tenant, appliqués sur l'ensemble des modules. L'isolation n'est pas un contrôle ajouté à chaque appel : elle est portée par la couche d'accès aux données elle-même.
03 / Expertise
Global Query Filters EF Core, claims JWT par tenant, RBAC entity-level sur Admin, Manager et Collaborateur. Aucune donnée ne franchit une frontière de tenant.
EF Core · JWT · RBAC
Lire l’étude de casRotation atomique des refresh tokens avec détection de réutilisation, révocation de sessions, concurrence optimiste PostgreSQL via xmin et conflits HTTP 409, editing presence temps réel en SignalR.
JWT · xmin · SignalR
Lire l’étude de casClean Architecture, CQRS, dispatcher OSS custom remplaçant 100+ handlers, Application Services, contrats *Request et pattern refetch GET.
Clean Architecture · CQRS
Lire l’étude de casSerilog avec corrélation multi-tenant, tests d'intégration PostgreSQL sous Testcontainers, quality gates GitHub Actions, déploiement Docker sur Azure App Service.
Serilog · Testcontainers · Docker
Lire l’étude de cas04 / Contrôle d’accès
Choisissez un rôle et un tenant. La même requête renvoie des lignes différentes, et certains liens deviennent inaccessibles. C'est le modèle d'accès livré chez TeamXtend, reproduit ici côté client.
Navigation
Écriture — Oui
GET /api/projects
3 lignes visibles · 2 hors périmètre
Deux mécanismes distincts sont à l'œuvre. Le Global Query Filter décide quelles lignes existent pour la requête : un Manager du tenant Nord ne peut pas lire une ligne du tenant Sud, même en forgeant l'identifiant. Les flags de navigation, eux, décident de ce qui est cliquable — ils améliorent l'expérience mais ne protègent rien, puisque l'API revérifie systématiquement.
05 / Concurrence
Deux utilisateurs éditent le même enregistrement. Sans concurrence optimiste, le second écrase le premier sans que personne ne le sache. Essayez.
—
db → "Refonte du portail client" · xmin 1042
PostgreSQL expose un compteur de version système, xmin, incrémenté à chaque écriture. EF Core le compare avant de valider : si la valeur a changé, la transaction est rejetée plutôt que d'écraser. Le bandeau de présence, lui, arrive par SignalR et prévient avant même la collision.
06 / Parcours
07 / Travaux
Comment garantir qu'aucune requête ne peut franchir une frontière de tenant, sans ajouter un filtre à chaque appel.
Multi-tenant · EF Core · JWT
Deux utilisateurs, un enregistrement, aucun écrasement silencieux. xmin, 409 et présence temps réel.
PostgreSQL · SignalR · Testcontainers
Un refresh token rejoué, une session encore valide après un changement de mot de passe. Rotation atomique, détection de réutilisation, révocation en cascade.
ASP.NET Core Identity · JWT · Sécurité
MediatR et AutoMapper passent en dual-license. 100+ handlers à migrer sans interrompre les livraisons.
Conformité · CQRS · Mapperly
Conçue, développée et déployée en solo : une plateforme de sites web et de gestion commerciale, en production chez un client réel.
Next.js · Payload CMS · Neon
08 / Stack
Cœur
Architecture
Données
Sécurité et API
Observabilité et tests
Cloud et CI/CD
Notions complémentaires
Survolez pour le contexte d'usage
09 / Notes
Retours d'expérience sur l'API .NET d'AutoCAD, la protection d'un logiciel de bureau, les montées de version .NET et l'observabilité multi-tenant.
10 / Questions
En portant l'isolation dans la couche d'accès aux données plutôt que dans chaque requête. Avec EF Core, un Global Query Filter appliqué à toutes les entités concernées ajoute automatiquement la condition sur le tenant à chaque requête LINQ générée. Le tenant provient d'un claim JWT validé, jamais du corps de la requête. Un développeur qui oublie une clause WHERE ne peut alors pas exposer les données d'un autre client.
Étude de cas liée — Isolation multi-tenant : isoler sans ralentir l'APISur PostgreSQL, xmin est préférable dans la plupart des cas. C'est une colonne système déjà maintenue par la base à chaque écriture : aucune colonne à ajouter, aucune migration, aucun risque d'oublier de l'incrémenter. Une colonne de version applicative garde son intérêt si vous devez rester portable entre plusieurs moteurs de base de données.
Étude de cas liée — Concurrence optimiste : le conflit qu'on ne voit pasCela dépend de l'usage réel. Si vous utilisez les pipelines, les notifications et le comportement complet de la bibliothèque, la licence est probablement le choix raisonnable. Si vous n'appelez que Send, comme beaucoup d'équipes, la surface à remplacer tient en une interface et une classe de dispatch — soit une journée de travail contre un coût récurrent.
Étude de cas liée — Sortir de MediatR et AutoMapper, en productionOui, ouvert aux opportunités autour de .NET, du SaaS multi-tenant et de l'architecture backend, en remote comme en relocalisation. Basé à Tunis. Contact par email à soltanifedi68@gmail.com ou via LinkedIn.
11 / Contact
Ouvert aux missions et postes autour du .NET, du SaaS multi-tenant et de l'architecture backend.