| Sorumluluk | Yer |
|---|---|
| Kullanıcı kimliği, parola, MFA, SSO, OAuth federasyonu | Keycloak |
| 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’i | Uygulama (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):
| Taraf | Realm (dev) | Client | Scheme adı | Cookie |
|---|---|---|---|---|
| Vatandaş (Website SPA) | diyanet-vatandas-dev-realm | diyanet-website | VatandasScheme | kc_vatandas_token |
| Personel (Admin SPA) | diyanet-yonetim-dev-realm | diyanet-admin | PersonelScheme | kc_personel_token |
citizen_id, personelde user_id).
Her iki scheme BuildingBlocks.Keycloak/DependencyInjection.cs içinde AddJwtBearer ile
kaydedilir; default scheme PersonelScheme’tir:
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ındakiClaimsTransformation zincirinden gelir
(DiyanetCleanArchitectureClaimTypes):
| Claim | Kaynak | Kullanım |
|---|---|---|
sub | Keycloak | Keycloak kullanıcı kimliği; transformation girdisi |
realm_access.roles | Keycloak | Rol claim’lerine dönüştürülür |
permissions[] (multivalued) | Keycloak Protocol Mapper + DB | PermissionAuthorizationHandler |
organization_id / tenant_id | Keycloak Protocol Mapper | Multi-tenant izolasyonu |
user_id | API (UserContextClaimsTransformation) | Local DB User.Id |
citizen_id | API (CitizenContextClaimsTransformation) | Vatandaş aggregate kimliği |
account_status | API (her istekte güncel) | ActiveAccountAuthorizationHandler |
token_version | Keycloak / local | TokenVersionMiddleware 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:
Dört koruma katmanı
- Authentication —
JwtBearertoken imzasını (RS256, JWKS), issuer’ı ve audience’ı doğrular. - Dynamic permission policy —
[RequirePermission("users:read")]→Permission:users:readpolicy adı →PermissionAuthorizationHandlerpermissionsclaim’ini kontrol eder. - Active-account guard — tüm policy’lere implicit
ActiveAccountRequirementeklenir;Pending/Banned/Suspendedhesaplar geçemez ([AllowPendingAccount]ile bypass). - Token version —
TokenVersionMiddlewareJWT’dekitoken_versionile DB’dekiUser.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.