Skip to main content
Bu sistemde authentication (kimlik doğrulama) Keycloak’a, authorization (yetkilendirme) uygulamaya aittir. Keycloak sadece “bu token gerçek ve geçerli” der; “bu kullanıcı bu işlemi yapabilir mi” sorusunu uygulama yanıtlar.
SorumlulukYer
Kullanıcı kimliği, parola, MFA, SSO, OAuth federasyonuKeycloak
Token üretimi (access, refresh, id_token)Keycloak
Token imza doğrulama (JWKS / RS256)API — JwtBearer middleware
Rol → permission haritasıUygulama (DB, role_permission seed)
Endpoint başına permission kontrolüUygulama (DynamicPermissionPolicyProvider)
Hesap durumu (Active/Pending/Banned) gate’iUygulama (ActiveAccountAuthorizationHandler)
Multi-tenant ayrımıUygulama (JWT claim + AuthorizationPipelineBehavior)

İki ayrı kimlik dünyası

API iki ayrı Keycloak realm’ından token kabul eder. Her realm için ayrı bir JWT Bearer scheme kaydedilir (src/BuildingBlocks/BuildingBlocks.Keycloak/KeycloakSchemeNames.cs):
TarafRealm (dev)ClientScheme adıCookie
Vatandaş (Website SPA)diyanet-vatandas-dev-realmdiyanet-websiteVatandasSchemekc_vatandas_token
Personel (Admin SPA)diyanet-yonetim-dev-realmdiyanet-adminPersonelSchemekc_personel_token
// BuildingBlocks.Keycloak/KeycloakSchemeNames.cs
public const string Vatandas = "VatandasScheme";
public const string Personel = "PersonelScheme";
public const string Any      = $"{Vatandas},{Personel}";
İki dünya birbirinden bağımsızdır: kullanıcı havuzları ayrı, scheme’ler ayrı, cookie isimleri ayrı (yan yana login durabilir), claim modelleri farklı (vatandaşta citizen_id, personelde user_id). Her iki scheme BuildingBlocks.Keycloak/DependencyInjection.cs içinde AddJwtBearer ile kaydedilir; default scheme PersonelScheme’tir:
services.AddAuthentication(KeycloakSchemeNames.Personel)
    .AddJwtBearer(KeycloakSchemeNames.Vatandas, options => ConfigureScheme(options, opts.Vatandas))
    .AddJwtBearer(KeycloakSchemeNames.Personel, options => ConfigureScheme(options, opts.Personel));

Token içindeki claim modeli

Doğrulanan token bir dizi claim taşır. Bazıları doğrudan Keycloak Protocol Mapper’dan, bazıları API tarafındaki ClaimsTransformation zincirinden gelir (DiyanetCleanArchitectureClaimTypes):
ClaimKaynakKullanım
subKeycloakKeycloak kullanıcı kimliği; transformation girdisi
realm_access.rolesKeycloakRol claim’lerine dönüştürülür
permissions[] (multivalued)Keycloak Protocol Mapper + DBPermissionAuthorizationHandler
organization_id / tenant_idKeycloak Protocol MapperMulti-tenant izolasyonu
user_idAPI (UserContextClaimsTransformation)Local DB User.Id
citizen_idAPI (CitizenContextClaimsTransformation)Vatandaş aggregate kimliği
account_statusAPI (her istekte güncel)ActiveAccountAuthorizationHandler
token_versionKeycloak / localTokenVersionMiddleware invalidasyonu
organization_id ve tenant_id eşdeğer kabul edilir. HttpContextCurrentTenant önce tenant_id, yoksa organization_id claim’ine düşer. Dev provisioning yapılandırması organization_id Protocol Mapper’ı kurar.

İstek başına akış

Middleware sırası Program.cs içinde nettir:
app.UseAuthentication();
app.UseTokenVersionValidation();  // Feature flag: Security:TokenVersionValidation
app.UseAuthorization();

Dört koruma katmanı

  1. AuthenticationJwtBearer token imzasını (RS256, JWKS), issuer’ı ve audience’ı doğrular.
  2. Dynamic permission policy[RequirePermission("users:read")]Permission:users:read policy adı → PermissionAuthorizationHandler permissions claim’ini kontrol eder.
  3. Active-account guard — tüm policy’lere implicit ActiveAccountRequirement eklenir; Pending/Banned/Suspended hesaplar geçemez ([AllowPendingAccount] ile bypass).
  4. Token versionTokenVersionMiddleware JWT’deki token_version ile DB’deki User.TokenVersion’ı karşılaştırır; eşleşmezse 401 (RBAC değişiminde anında invalidasyon).

Bu bölümde

Authentication

Token edinimi, dual JwtBearer, cookie + header + query, refresh rotation, token version.

Authorization

Dinamik permission policy, handler’lar, roller, RolePermission seed.

Multi-Tenancy

organization_id/tenant_id claim, soft-tenant, pipeline izolasyonu.

Keycloak Genel Bakış

Çift realm, client’lar, provisioning ve ortam yönetimi.