NextQuantumSystem.Protect.SwaggerGuard
1.0.0
See the version list below for details.
dotnet add package NextQuantumSystem.Protect.SwaggerGuard --version 1.0.0
NuGet\Install-Package NextQuantumSystem.Protect.SwaggerGuard -Version 1.0.0
<PackageReference Include="NextQuantumSystem.Protect.SwaggerGuard" Version="1.0.0" />
<PackageVersion Include="NextQuantumSystem.Protect.SwaggerGuard" Version="1.0.0" />
<PackageReference Include="NextQuantumSystem.Protect.SwaggerGuard" />
paket add NextQuantumSystem.Protect.SwaggerGuard --version 1.0.0
#r "nuget: NextQuantumSystem.Protect.SwaggerGuard, 1.0.0"
#:package NextQuantumSystem.Protect.SwaggerGuard@1.0.0
#addin nuget:?package=NextQuantumSystem.Protect.SwaggerGuard&version=1.0.0
#tool nuget:?package=NextQuantumSystem.Protect.SwaggerGuard&version=1.0.0
NextQuantumSystem.Protect — SwaggerGuard
Swagger UI'yi ve ilişkili endpoint'leri JWT + rol geçidinin arkasına alan, DLL olarak her projeye takılabilen yeniden kullanılabilir koruma modülü.
| Sürüm | 1.0.0 |
| Tarih | 2026-07-18 |
| Hedef Framework | .NET 10 (net10.0) |
| ABP | 10.5.0 (opsiyonel — düz ASP.NET Core da desteklenir) |
| Durum | Çekirdek + ABP sarmalayıcı + 10 integration testi (10/10 geçiyor) |
İçindekiler
- Amaç — Neden & Niçin
- Nasıl Çalışır — Akış
- Mimari
- Kurulum & Kullanım
- Konfigürasyon Referansı
- Güvenlik Notları
- Test
- Sık Sorulanlar
- Sürüm Geçmişi
1. Amaç — Neden & Niçin
Problem
ABP / ASP.NET Core projelerinde Swagger UI (/swagger) çoğu zaman herkese açık gelir. Development/staging ortamlarında bu, API şemasının, endpoint listesinin ve örnek payload'ların yetkisiz kişilere sızması demektir.
Çözüm
Swagger direkt açılmaz. Yerine token giriş sayfası çıkar; kullanıcı geçerli bir JWT girer, token imzası + issuer + expiry doğrulanır ve yalnızca izin verilen rollere (AllowedRoles) sahip kullanıcılar Swagger'a erişebilir.
Neden ayrı bir modül / DLL?
Aynı korumayı onlarca mikroservise kopyala-yapıştır yapmak yerine, tek bir DLL'i her projeye takıp her serviste tutarlı koruma sağlanır (defense-in-depth: her servis kendini korur, sadece gateway'e güvenilmez). Her proje sadece kendi appsettings.json'ındaki değerleri değiştirir; kod ve DLL aynı kalır, yeniden derleme gerekmez.
2. Nasıl Çalışır — Akış
İstek ──▶ SwaggerProtectionMiddleware
│
├─ IsEnabled=false? ──▶ dokunma, geç
│
├─ Yol == TokenInputPath (auth/swagger)?
│ ├─ GET ──▶ token giriş sayfasını göster (200)
│ └─ POST ──▶ token doğrula
│ ├─ geçersiz/expired ──▶ sayfa + 401
│ ├─ rol uygun değil ──▶ sayfa + 403
│ └─ geçerli+rol OK ──▶ cookie yaz + returnUrl'e 302
│
├─ Yol ProtectedPaths içinde değil? ──▶ geç
│
└─ Korunan yol:
├─ cookie yok ──▶ giriş sayfasına 302
├─ cookie geçersiz ──▶ cookie sil + giriş sayfasına 302
├─ rol uygun değil ──▶ 403
└─ her şey OK ──▶ Swagger'a geç
Cookie: doğrulanan token __auth_token adıyla, HttpOnly + Secure (HTTPS'te) + SameSite=Lax + CookieExpirationHours süreli olarak yazılır.
3. Mimari
Karar: çekirdek ABP'den bağımsız, böylece hem ABP hem düz ASP.NET Core host'lar kullanabilir. ABP tarafı ince bir sarmalayıcıdır.
Protect/
├── src/
│ ├── NextQuantumSystem.Protect.SwaggerGuard/ ← ABP'siz düz çekirdek
│ │ ├── SwaggerProtectionOptions.cs · tüm ayarlar
│ │ ├── SwaggerProtectionMiddleware.cs · path/cookie/rol/redirect mantığı
│ │ ├── SwaggerProtectionExtensions.cs · AddSwaggerProtection / UseSwaggerProtection
│ │ └── Internal/
│ │ ├── IJwtTokenValidator.cs · doğrulama soyutlaması
│ │ ├── JwksJwtTokenValidator.cs · Authority/JWKS ile imza doğrulama
│ │ └── TokenInputPageRenderer.cs · token giriş sayfası (HTML)
│ │
│ └── NextQuantumSystem.Protect.SwaggerGuard.Abp/ ← ince ABP modülü
│ └── ProtectSwaggerGuardModule.cs · AbpModule, otomatik wiring
│
└── test/
└── NextQuantumSystem.Protect.SwaggerGuard.Tests/ ← in-memory TestServer, 10 test
| Katman | Bağımlılık | Amaç |
|---|---|---|
SwaggerGuard |
Microsoft.AspNetCore.App, Microsoft.IdentityModel.* |
Framework-agnostik çekirdek. Düz ASP.NET Core host'lar buna doğrudan takılır. |
SwaggerGuard.Abp |
Volo.Abp.AspNetCore + çekirdek |
ABP host'ları için otomatik wiring. |
4. Kurulum & Kullanım
4.a) ABP Host
1. Referans ver (proje referansı veya DLL/NuGet):
NextQuantumSystem.Protect.SwaggerGuard.Abp
2. Modülü bağımlılık olarak ekle:
[DependsOn(
typeof(ProtectSwaggerGuardModule) // ← tek satır, gerisi otomatik
// ... diğer modülleriniz
)]
public class MyServiceHttpApiHostModule : AbpModule { }
3. appsettings.json'a "Swagger" bölümünü ekle (bkz. Konfigürasyon).
Middleware, modül host'un bağımlılığı olduğu için host'un kendi
UseAbpSwaggerUI()çağrısından önce kaydolur (ABP init sırası: bağımlılıklar önce). Ekstra birUse...çağrısı gerekmez.
4.b) Düz ASP.NET Core Host
1. Referans ver:
NextQuantumSystem.Protect.SwaggerGuard
2. Program.cs:
var builder = WebApplication.CreateBuilder(args);
// "Swagger" bölümünden bind eder
builder.Services.AddSwaggerProtection(builder.Configuration);
var app = builder.Build();
app.UseSwaggerProtection(); // ← Swagger UI'DEN ÖNCE
app.UseSwagger();
app.UseSwaggerUI();
app.Run();
Alternatif kayıt yöntemleri:
// Belirli bir bölümden
services.AddSwaggerProtection(builder.Configuration.GetSection("Swagger"));
// Kod içi (sabit değerler koda, değişkenler config'e)
services.AddSwaggerProtection(o =>
{
o.Authority = "https://id.example.com";
o.ProtectedPaths = new() { "swagger", "swagger/v1/swagger.json" };
o.AllowedRoles = new() { "admin" };
});
5. Konfigürasyon Referansı
appsettings.json içindeki "Swagger" bölümü SwaggerProtectionOptions'a bind edilir.
{
"Swagger": {
"IsEnabled": true,
"RoutePrefix": "swagger",
"DocumentTitle": "API Dokümanı",
"CookieName": "__auth_token",
"CookieExpirationHours": 8,
"TokenInputPath": "auth/swagger",
"ProtectedPaths": [
"swagger",
"api/abp/api-definition",
"swagger/v1/swagger.json"
],
"AllowedRoles": ["admin"],
"Authority": "https://id.example.com",
"Audience": "my-service",
"ValidateAudience": false,
"ValidateIssuer": true,
"RequireHttpsMetadata": true,
"RoleClaimTypes": ["role", "roles"]
}
}
| Ayar | Tip | Varsayılan | Açıklama |
|---|---|---|---|
IsEnabled |
bool | true |
false ise middleware hiçbir şey yapmaz (koruma kapalı). |
RoutePrefix |
string | "swagger" |
Bilgilendirme amaçlı; returnUrl fallback'i olarak kullanılır. |
DocumentTitle |
string | "API Dokümanı" |
Token giriş sayfasının <title>'ı. |
CookieName |
string | "__auth_token" |
Doğrulanmış JWT'nin saklandığı cookie. |
CookieExpirationHours |
int | 8 |
Cookie geçerlilik süresi (saat). |
TokenInputPath |
string | "auth/swagger" |
Token giriş sayfasının yolu. Asla ProtectedPaths içinde olmamalı (sonsuz redirect). |
ProtectedPaths |
string[] | [] |
Korunacak yol önekleri (leading slash'siz). İstek yolu bunlardan biriyle başlıyorsa koruma uygulanır. |
AllowedRoles |
string[] | [] |
İzin verilen roller. Boşsa: doğrulanmış herhangi bir token yeterli sayılır (rol kısıtı yok). |
Authority |
string? | null |
Token'ı üreten OpenID/OAuth otoritesi. JWKS buradan çekilir. Doğrulama için zorunlu. |
Audience |
string? | null |
Beklenen audience (ValidateAudience=true ise zorunlu). |
ValidateAudience |
bool | false |
Audience doğrulaması yapılsın mı? |
ValidateIssuer |
bool | true |
Issuer doğrulaması (Authority'den gelen issuer ile). |
RequireHttpsMetadata |
bool | true |
Authority metadata için HTTPS zorunlu mu? (dev'de false olabilir). |
RoleClaimTypes |
string[] | ["role","roles","...schemas.../role"] |
Rol claim'lerinin okunacağı tip listesi (farklı IdP'ler farklı isim kullanır). |
Her projede değişen değerler (
Authority,Audience) DLL içinde değil, her host'un kendi config'inde tutulur. Tekrarı azaltmak için: ortakappsettings.shared.json, environment variable (Swagger__Authority=...) veya kod-içiAddSwaggerProtection(o => ...)overload'u kullanılabilir.
📄 Tam örnek + açıklamalı senaryolar:
samples/appsettings.Swagger.sample.jsonc— her ayarın satır-içi açıklaması ve 5 hazır senaryo (production, development, rol-kısıtsız, audience-doğrulamalı, kapalı).
6. Güvenlik Notları
- 🔴 JWT imzası MUTLAKA doğrulanır.
Authorityyapılandırılmazsa doğrulama başarısız döner — token asla "sadece decode edilip" kabul edilmez. Bu, saldırganın kendirole=admintoken'ını üretmesini engeller. İmza + issuer + expiry hep doğrulanır. - 🔁 Sonsuz redirect koruması:
TokenInputPathasla korunan değildir; kendi içinde ele alınır. - 🍪 Cookie:
HttpOnly(JS erişemez) +Secure(HTTPS'te) +SameSite=Lax. Bayat/geçersiz cookie otomatik silinir. - ↩️ Open-redirect koruması:
returnUrlyalnızca site-içi (yerel) yollara izin verir;//veya mutlak URL'ler reddedilir. - ⚠️
api/abp/api-definition'ı korumak, ABP dinamik client-proxy üretimini etkileyebilir (cookie'siz çağıran araçlar 302 alır). Bilinçli tercih olmalı. - 🌐 Gateway/reverse-proxy:
X-Forwarded-*/ PathBase algılanan yolu değiştirebilir;ProtectedPathseşleştirmesi buna göre ayarlanmalı.
7. Test
In-memory TestServer üzerinde gerçek HTTP akışıyla 10 integration testi (test/NextQuantumSystem.Protect.SwaggerGuard.Tests). JWKS yerine simetrik anahtarlı bir doğrulayıcı enjekte edilerek tüm middleware mantığı sınanır.
dotnet test NextQuantumSystem.Protect.slnx
| Senaryo | Beklenen |
|---|---|
Serbest yol (/healthz) |
200 (geçer) |
| Korunan yol, cookie yok | 302 → /auth/swagger?returnUrl=... |
| Giriş sayfası GET | 200 + HTML |
| POST geçerli admin token | 302 + Set-Cookie |
| POST geçerli non-admin token | 403 |
| POST geçersiz token | 401 |
| POST expired token | 401 |
| Korunan yol + geçerli admin cookie | 200 (geçer) |
| Korunan yol + non-admin cookie | 403 |
| Korunan yol + bozuk cookie | 302 + cookie silinir |
Sonuç: 10/10 geçiyor.
8. Sık Sorulanlar
S: Bu bir ABP modülü mü, yoksa düz kütüphane mi?
İkisi de. Çekirdek (SwaggerGuard) ABP'siz düz kütüphanedir; SwaggerGuard.Abp onu ABP host'ları için otomatik wire eden ince bir modüldür.
S: Her mikroservis için ayrı DLL derlemek gerekir mi?
Hayır. Aynı DLL tüm projelerde kullanılır; sadece appsettings.json değişir.
S: Bu proje neden 8 katmanlı ABP şablonu değil? Swagger koruması bir middleware işidir; Domain/EF/Application katmanları gerekmez. Şablon, sadece bu üç projeye sadeleştirildi. İleride DB gerektiren özellik eklenirse ilgili katman ABP CLI/Studio ile ya da git geçmişinden geri getirilebilir.
9. Sürüm Geçmişi
1.0.0 — 2026-07-18
- İlk sürüm.
SwaggerProtectionMiddleware: path eşleştirme, cookie tabanlı JWT geçidi, rol kontrolü, redirect akışı.JwksJwtTokenValidator: Authority/JWKS ile imza + issuer + expiry doğrulaması.- Token giriş sayfası (MVC'siz, HTML render).
- Düz ASP.NET Core için
AddSwaggerProtection/UseSwaggerProtectionextension'ları. - ABP host'ları için
ProtectSwaggerGuardModule(tek[DependsOn]ile otomatik wiring). - 10 integration testi (in-memory TestServer).
- ABP DDD şablon katmanları (Domain, Application, EntityFrameworkCore, HttpApi, HttpApi.Client, Installer) bu amaç için gereksiz olduğundan çıkarıldı.
| 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.IdentityModel.JsonWebTokens (>= 8.16.0)
- Microsoft.IdentityModel.Protocols.OpenIdConnect (>= 8.16.0)
NuGet packages (1)
Showing the top 1 NuGet packages that depend on NextQuantumSystem.Protect.SwaggerGuard:
| Package | Downloads |
|---|---|
|
NextQuantumSystem.Protect.SwaggerGuard.Abp
SwaggerGuard korumasını ABP host'larına tek [DependsOn] ile otomatik ekleyen ABP modülü. NextQuantumSystem.Protect.SwaggerGuard çekirdeğini sarar. |
GitHub repositories
This package is not used by any popular GitHub repositories.