Skip to main content
BuildingBlocks.Keycloak API’yi iki ayrı Keycloak realm’ından token kabul edecek şekilde yapılandırır: Vatandaş (citizen SPA) ve Personel (yönetim paneli). Tek AddKeycloak(...) çağrısı iki JwtBearer şeması kurar, claims transformation zincirini kaydeder ve ICurrentUserService ile aktif kullanıcı bağlamını sunar.
Geniş kapsamlı Keycloak konuları (realm yapısı, provisioning, ortamlar, sorun giderme) Keycloak grubundadır. Bu sayfa paketin kod tarafına odaklanır.

Yapılandırma — KeycloakOptions

appsettings.json’daki Keycloak bölümüyle bind edilir. İki alt bölüm vardır: Vatandas ve Personel, her ikisi de KeycloakSchemeOptions tipinde.

KeycloakSchemeOptions

KeycloakSchemeNames

[Authorize] attribute’larında kullanılan sabit şema adları:
Default şema Personel’dir (AddAuthentication(KeycloakSchemeNames.Personel)). Şema belirtmeyen [Authorize] attribute’ları Personel realm’ını kullanır; vatandaş endpoint’leri açıkça KeycloakSchemeNames.Vatandas belirtmelidir.

Arayüzler

ICurrentUserService HTTP context tabanlı CurrentUserService ile implement edilir; UserId önce user_id, yoksa Keycloak sub claim’ini okur. IUserContextProvider varsayılan olarak no-op NullUserContextProvider’dir — Application katmanı kendi implementasyonunu services.AddScoped<IUserContextProvider, UserContextProvider>() ile kaydeder.

DI kaydı — AddKeycloak

ConfigureScheme her şemada şunları yapar:
  • MapInboundClaims = falsesub claim’inin korunması kritik (aksi halde UserContextClaimsTransformation sub bulamaz, 403 üretir).
  • ValidIssuers = [Issuer, PublicIssuer] — Docker dev’de internal (http://keycloak:8080) ile public (http://localhost:8080) issuer farklı olabilir.
  • ValidAudiences = [ClientId, "account"].
  • NameClaimType = "preferred_username", ClockSkew = 30s.
  • OnMessageReceived token kaynak önceliği: 1) cookie (CookieName) → 2) Authorization: Bearer header → 3) query string access_token (yalnızca /hubs ve /files path’lerinde — SignalR/FileServer için).

Yapılandırma anahtarları

Kullanım — çift realm

MapInboundClaims = false ayarı atlanırsa JwtSecurityTokenHandler subClaimTypes.NameIdentifier dönüşümü yapar ve principal’da artık ham sub claim’i kalmaz. Bu durumda UserContextClaimsTransformation FindFirstValue("sub") ile boş döner → accountStatus çözülemez → her yerde 403. Paket bunu kasten kapatır.

İlgili

Keycloak (genel)

Realm yapısı, provisioning, ortamlar, sorun giderme.

Authorization

Permission policy provider ve RBAC akışı.

JWT

Backoffice + OTPChallenge custom JWT şemaları.

OAuth

Google/Meta/Keycloak PKCE akışı.