NetCoreBackend.NArchitecture.Core.MultiTenancy
2.0.0
dotnet add package NetCoreBackend.NArchitecture.Core.MultiTenancy --version 2.0.0
NuGet\Install-Package NetCoreBackend.NArchitecture.Core.MultiTenancy -Version 2.0.0
<PackageReference Include="NetCoreBackend.NArchitecture.Core.MultiTenancy" Version="2.0.0" />
<PackageVersion Include="NetCoreBackend.NArchitecture.Core.MultiTenancy" Version="2.0.0" />
<PackageReference Include="NetCoreBackend.NArchitecture.Core.MultiTenancy" />
paket add NetCoreBackend.NArchitecture.Core.MultiTenancy --version 2.0.0
#r "nuget: NetCoreBackend.NArchitecture.Core.MultiTenancy, 2.0.0"
#:package NetCoreBackend.NArchitecture.Core.MultiTenancy@2.0.0
#addin nuget:?package=NetCoreBackend.NArchitecture.Core.MultiTenancy&version=2.0.0
#tool nuget:?package=NetCoreBackend.NArchitecture.Core.MultiTenancy&version=2.0.0
Core.MultiTenancy
SaaS uygulamaları için multi-tenant altyapısı. Tenant tespitini JWT claim, HTTP header ve subdomain üzerinden sırayla yapar.
Tenant Tespiti (Öncelik Sırası)
1. JWT claim: "tenant_id" → En güvenli, token doğrulandıktan sonra gelir
2. HTTP Header: X-Tenant-ID → API client'lar ve geliştirme ortamı için
3. Subdomain: acme.yourapp.com → Production SaaS URL yapısı için
Bileşenler
| Bileşen | Açıklama |
|---|---|
Tenant |
Tenant kaydı entity'si (name, identifier/slug, domain, plan, defaultLocale, isActive) |
ITenantContext |
Mevcut tenant'ı okumak için DI'a inject edilen interface |
TenantContext |
Scoped, request başına sıfırlanan ITenantContext implementasyonu |
ITenantService |
Uygulamada implement edilmesi gereken tenant lookup interface'i |
TenantEntitySetter |
ITenantEntitySetter implementasyonu — Add işlemlerinde TenantId'yi otomatik set eder |
TenantMiddleware |
Her request'te tenant'ı çözen middleware. JWT'de tenant_id varken tenant DB'de yoksa 401 döner. |
TenantClaimTypes |
Claim key sabitleri (tenant_id, is_super_admin, is_impersonating) |
Kurulum
// Program.cs
builder.Services.AddMultiTenancy();
// → ITenantContext, TenantContext ve ITenantEntitySetter otomatik kaydedilir
builder.Services.AddScoped<ITenantService, YourTenantService>();
app.UseAuthentication();
app.UseMultiTenancy(); // UseAuthentication'dan SONRA gelmeli
app.UseAuthorization();
Middleware sırası neden önemli?
TenantMiddleware'in 1. öncelik kaynağı JWT'dekitenant_idclaim'idir. Bu claim ancakUseAuthentication()çalıştıktan sonraHttpContext.Userüzerinden okunabilir. Sıralama ters olursaUser.Claimsboş kalır, middleware doğrudan header/subdomain fallback'lerine düşer ve oturum açmış kullanıcılar bile yanlış tenant'a (veya hiçbir tenant'a) yönlendirilir.
AddMultiTenancy() şunları kaydeder:
TenantContext(scoped)ITenantContext→TenantContext(scoped)ITenantEntitySetter→TenantEntitySetter(scoped) — ayrıca kaydetmeye gerek yoktur
Tenant Entity
public class Tenant : Entity<Guid>
{
public string Name { get; set; }
public string Identifier { get; set; } // slug: "acme"
public string? Domain { get; set; }
public bool IsActive { get; set; }
public TenantPlanType PlanType { get; set; }
public string? DefaultLocale { get; set; } // "tr", "de" — Accept-Language yoksa fallback
}
DefaultLocale: Client Accept-Language header'ı göndermediğinde LocalizationMiddleware bu değeri fallback olarak kullanır.
Identifierunique olmalı. Framework code-level uniqueness check yapmıyor; DB constraint'i consuming app'inDbContextkonfigürasyonunda eklenmeli:modelBuilder.Entity<Tenant>().HasIndex(t => t.Identifier).IsUnique(); // Domain için de aynı (Domain nullable, multi-tenant) modelBuilder.Entity<Tenant>() .HasIndex(t => t.Domain) .IsUnique() .HasFilter("[Domain] IS NOT NULL");Bu constraint olmazsa
acmeslug'lı iki Tenant kaydı oluşturulabilir,GetBySlugAsyncbelirsiz sonuç döndürür.
SuperAdmin
JWT'de is_super_admin: true ve tenant_id: null olan kullanıcı tüm tenant verilerine erişir (EF Core global filter bypass edilir). Belirli bir tenant'a geçmek için impersonation token kullanılır.
Detaylı dokümantasyon: TENANT.md
| Product | Versions Compatible and additional computed target framework versions. |
|---|---|
| .NET | net10.0 is compatible. net10.0-android was computed. net10.0-browser was computed. net10.0-ios was computed. net10.0-maccatalyst was computed. net10.0-macos was computed. net10.0-tvos was computed. net10.0-windows was computed. |
-
net10.0
- Microsoft.EntityFrameworkCore (>= 10.0.5)
- Microsoft.EntityFrameworkCore.InMemory (>= 10.0.5)
- Microsoft.EntityFrameworkCore.Relational (>= 10.0.5)
- NetCoreBackend.NArchitecture.Core.Persistence (>= 1.0.1)
- System.Linq.Dynamic.Core (>= 1.7.1)
NuGet packages (3)
Showing the top 3 NuGet packages that depend on NetCoreBackend.NArchitecture.Core.MultiTenancy:
| Package | Downloads |
|---|---|
|
NetCoreBackend.NArchitecture.Core.Security
Provides security utilities for hashing, encryption, JWT, authenticator, and more. |
|
|
NetCoreBackend.NArchitecture.Core.Localization.WebApi
Provide localization support for ASP.NET Web API. |
|
|
NetCoreBackend.NArchitecture.Core.Application
Provide CQRS, MediatR, Pipelines, DTOs, and more for the Application Layer. |
GitHub repositories
This package is not used by any popular GitHub repositories.