Ana içeriğe geç

MMX Permissions — Kurulum ve Kullanım Kılavuzu

Bu kılavuz, MMX Permissions kütüphanesinin ne yaptığını, nasıl yapılandırıldığını ve yönetim arayüzünün nasıl kullanıldığını açıklar.


İçindekiler​


1. Genel Bakış​

MMX Permissions, ASP.NET Core tabanlı uygulamalara granüler izin yönetimi ekleyen bir kütüphanedir. Temel amacı şudur:

  • Sistemdeki API endpoint'lerini tanımlamak ve bunlara izin kodu atamak
  • Kullanıcıların sahip olduğu rollere göre bu izinlere erişimlerini otomatik olarak denetlemek
  • Tüm bu yapılandırmayı bir web arayüzü üzerinden kolayca yönetmek

Kütüphane iki ana bileşenden oluşur:

BileşenAçıklama
mmx-permissions.Coreİzin denetim motoru, veritabanı, API endpoint'leri ve middleware
mmx-permissions.UITarayıcı üzerinden izin yönetimi yapılabilen Razor Class Library

2. Temel Kavramlar​

İzin (Permission)​

Sistemde tanımlanmış bir yetkiyi temsil eden isimlendirilmiş bir nesnedir. Her iznin benzersiz bir kodu ve açıklaması vardır.

Örnek izinler:

  • users.read — Kullanıcıları listeleme yetkisi
  • product.edit — Ürün düzenleme yetkisi
  • order.delete — Sipariş silme yetkisi

Rol (Security Role)​

Roller dışarıdan gelir; MMX Permissions kendi rol veritabanını tutmaz. Roller, uygulamanın bağlı olduğu kimlik sağlayıcısından (Identity Server, Azure AD, vb.) okunur. Bir role bir veya birden fazla izin atanabilir. Kullanıcı hangi rolü taşıyorsa, o rolün tüm izinlerine otomatik olarak sahip olur.

Endpoint​

Uygulamada bulunan bir HTTP yolunun (controller + action veya endpoint grubu) temsilidir. Her endpoint'e hangi izinlerin erişebileceği tanımlanır.

Endpoint Grubu (Endpoint Group)​

Birden fazla endpoint'i mantıksal olarak bir araya getiren bir etiket. Örneğin "Products" grubu altında ürünlerle ilgili tüm endpoint'ler toplanabilir. Grup bazlı izin tanımlaması, tek tek endpoint tanımlamaktan daha pratiktir.

İzin Denetimi Akışı (Özet)​

Kullanıcı → JWT Token → Middleware → Kullanıcının rolleri → Rollerin izinleri → Endpoint izni → ✅ veya ❌

3. Mimari: Sistem Nasıl Çalışır?​

MMX Permissions, bir HTTP isteği geldiğinde devreye giren bir middleware (ara katman yazılımı) içerir. Bu middleware şu adımları sırasıyla gerçekleştirir:

1. Yolu Filtrele Statik dosyalar (CSS, JS, resimler), temel sistem endpoint'leri ve kimlik doğrulama yolları denetim dışında tutulur.

2. Kullanıcı Kimliğini Doğrula JWT token'dan kullanıcı kimliği okunur. Token geçerli değilse istek reddedilir (401 Unauthorized).

3. Endpoint'i Tanımla Middleware, gelen isteğin hangi controller/action veya endpoint grubuna ait olduğunu otomatik olarak tespit eder. Bunu yapmak için birden fazla strateji kullanır:

  • ASP.NET Core route verisi
  • Endpoint metadata analizi
  • Sınıf adı örüntüsü tanıma

4. Kullanıcı İzinlerini Kontrol Et Harici rol servisi aracılığıyla kullanıcının rollerine bakılır. Bu rollere atanmış izinler toplanır. Endpoint için gereken izinlerle karşılaştırılır.

5. Karar Ver

  • Kullanıcı gerekli izne sahipse: istek geçer ✅
  • Sahip değilse: 403 Forbidden döner ❌
  • Endpoint'e hiç izin tanımlanmamışsa: AllowUnprotectedEndpoints ayarına göre karar verilir

Not: Roller her zaman dışarıdan gelir. MMX Permissions, kullanıcıların hangi rollere sahip olduğunu kendi veritabanında saklamaz; bu bilgiyi IRoleService arayüzü üzerinden alır. Bu arayüzü uygulamanın kendi kimlik sistemiyle entegre etmek geliştiricinin sorumluluğundadır.


4. Ön Koşullar​

MMX Permissions'ı kullanabilmek için aşağıdakiler gereklidir:

GereksinimDetay
.NET.NET 8 veya üzeri
VeritabanıMicrosoft SQL Server veya PostgreSQL
Kimlik SağlayıcıOpenID Connect destekleyen herhangi bir sunucu (IdentityServer, Azure AD, Keycloak, vb.)
JWT TokenKullanıcıların admin rol talebini (claim) taşıyan geçerli bir JWT token'ı olmalıdır

Yönetim arayüzüne yalnızca admin rolüne sahip kullanıcılar erişebilir. Bu rol kimlik sağlayıcınızda tanımlanmış ve kullanıcılara atanmış olmalıdır.


5. Konfigürasyon​

Tüm ayarlar appsettings.json dosyası üzerinden yapılır.

5.1 Veritabanı Bağlantısı​

SQL Server için​

{
"MmxPermissions": {
"Core": {
"ConnectionString": "Server=sunucu_adresi;Database=MmxPermissions;User Id=kullanici;Password=sifre;TrustServerCertificate=true;",
"DatabaseProvider": "SqlServer"
}
}
}

PostgreSQL için​

{
"MmxPermissions": {
"Core": {
"ConnectionString": "Host=sunucu_adresi;Database=mmx_permissions;Username=kullanici;Password=sifre;",
"DatabaseProvider": "PostgreSQL"
}
}
}

Bağlantı dizesindeki sunucu_adresi, kullanici ve sifre değerlerini kendi ortamınıza göre güncelleyin. Üretim ortamında bağlantı dizesini düz metin yerine ortam değişkenleri veya bir secret yöneticisi (Azure Key Vault, AWS Secrets Manager vb.) aracılığıyla sağlamanız önerilir.


5.2 Çekirdek Ayarlar​

{
"MmxPermissions": {
"Core": {
"ConnectionString": "...",
"DatabaseProvider": "SqlServer",
"EnablePermissionMiddleware": true,
"AllowUnprotectedEndpoints": true,
"DevelopmentStartupDelayMs": 5000
}
}
}
ParametreTürVarsayılanAçıklama
ConnectionStringstring—Veritabanı bağlantı dizesi (zorunlu)
DatabaseProviderstring"SqlServer"Veritabanı türü: "SqlServer" veya "PostgreSQL"
EnablePermissionMiddlewarebooltrueİzin denetim middleware'ini aktif eder/pasifleştirir
AllowUnprotectedEndpointsbooltruetrue: İzin tanımlanmamış endpoint'lere herkes erişebilir. false: İzin tanımlanmamış endpoint'ler varsayılan olarak engellenir
DevelopmentStartupDelayMsint5000Geliştirme ortamında başlangıç gecikmesi (ms). Veritabanının hazır olmasını beklemek için kullanılır

AllowUnprotectedEndpoints için önerilen yaklaşım:

OrtamÖnerilen DeğerSebep
Geliştirme / TesttrueHenüz izin tanımlanmamış endpoint'leri test edebilmek için
ÜretimfalseGüvenlik: tüm endpoint'lerin açıkça yetkilendirilmesi zorunlu olsun

5.3 Kimlik Doğrulama (OpenID Connect) Ayarları​

Yönetim arayüzü, kullanıcıları kimlik sağlayıcınıza yönlendirerek oturum açtırır.

{
"MmxPermissions": {
"UI": {
"Authority": "https://kimlik-sunucunuz.com",
"ClientId": "mmx-permissions-client",
"ClientSecret": "gizli-anahtar",
"Scopes": ["openid", "profile", "roles"],
"SessionTimeoutMinutes": 30,
"NameClaimType": "name",
"RoleClaimType": "role"
}
}
}
ParametreAçıklama
AuthorityOpenID Connect kimlik sağlayıcısının URL'i
ClientIdKimlik sağlayıcıda kayıtlı uygulama kimliği
ClientSecretUygulama gizli anahtarı (üretimde secret yöneticisinde tutulmalıdır)
Scopesİstenen OAuth kapsamları. roles kapsamı, rol bilgisinin token'a dahil edilmesi için gereklidir
SessionTimeoutMinutesOturum zaman aşımı (dakika). Varsayılan: 30
NameClaimTypeKullanıcı adı için kullanılacak claim türü
RoleClaimTypeRol bilgisi için kullanılacak claim türü. Kimlik sağlayıcınızın gönderdiği claim adıyla eşleşmelidir

Önemli: Kimlik sağlayıcınızda admin adında bir rol tanımlanmış olmalı ve yönetici kullanıcıların bu rol ile oturum açması gerekir. RoleClaimType değeri, token içindeki rol alanının adıyla birebir eşleşmelidir.


6. Yönetim Arayüzü​

Yönetim arayüzüne aşağıdaki adres üzerinden erişilir (alan adı ve port uygulamanıza göre değişir):

https://uygulamaniz.com/mmxpermissions

Oturum açmak için kimlik sağlayıcınıza yönlendirilirsiniz. Yalnızca admin rolüne sahip kullanıcılar giriş yapabilir.


6.1 Ana Sayfa (Dashboard)​

Giriş yaptıktan sonra karşınıza aşağıdaki yönetim kartları çıkar:

KartAçıklama
UsersKullanıcıları ve rollerini görüntüler
RolesRolleri ve bu rollere atanmış izinleri yönetir
PermissionsSistemdeki izinleri (permission) oluşturur, düzenler, siler
EndpointsTek tek endpoint izinlerini yapılandırır
Endpoint GroupsGruplandırılmış endpoint izinlerini yapılandırır (yakında — henüz aktif değil)

6.2 İzinler (Permissions)​

Bu ekranda sistemde tanımlı tüm izinleri görebilir ve yönetebilirsiniz.

Yeni izin oluşturma:

  1. Permissions kartına tıklayın.

  2. Create / Yeni İzin butonuna tıklayın.

  3. Aşağıdaki alanları doldurun:

    AlanAçıklamaÖrnek
    Codeİznin benzersiz kod adıusers.read
    Descriptionİznin ne işe yaradığını açıklayan metinKullanıcı listesini görüntüleme yetkisi
  4. Kaydedin.

İzin güncelleme: Listeden ilgili izne tıklayın ve alanları düzenleyin.

İzin silme: Silmek istediğiniz iznin yanındaki sil butonuna tıklayın. Bu işlem geri alınamaz; silinen iznin tüm endpoint ve rol ilişkileri de kaldırılır.


6.3 Roller (Roles)​

Roller harici kimlik sisteminizden okunur; bu ekranda yeni rol oluşturamazsınız. Ancak mevcut rollere izin atayabilir veya atanmış izinleri kaldırabilirsiniz.

Bir role izin atama:

  1. Roles kartına tıklayın.
  2. İzin atamak istediğiniz rolü seçin.
  3. Assign Permission / İzin Ata seçeneğine tıklayın.
  4. Listeden atamak istediğiniz izni seçin ve onaylayın.

Rol izinlerini görüntüleme:

  • Bir rolün üzerine tıkladığınızda o role atanmış tüm izinleri görebilirsiniz.

Bir rolden izin kaldırma:

  • Rol detayında ilgili iznin yanındaki kaldır butonuna tıklayın.

6.4 Kullanıcılar (Users)​

Bu ekranda sisteme erişen kullanıcılar ve sahip oldukları roller listelenir.

  • Kullanıcı listesi harici kimlik sisteminizden gelir; burada kullanıcı oluşturma veya silme işlemi yapılmaz.
  • Bir kullanıcıya tıklayarak hangi rollere sahip olduğunu ve dolayısıyla hangi izinlere erişebildiğini görebilirsiniz.

6.5 Endpoint'ler​

Bu ekranda uygulamada keşfedilmiş API endpoint'leri listelenir ve her bir endpoint için hangi izinlerin gerektiği tanımlanabilir.

Endpoint'e izin atama:

  1. Endpoints kartına tıklayın.
  2. İzin tanımlamak istediğiniz endpoint'i bulun (controller ve action adına göre filtreleyebilirsiniz).
  3. Assign Permissions / İzin Ata seçeneğine tıklayın.
  4. Listeden bir veya birden fazla izin seçin ve onaylayın.

Endpoint izni kaldırma:

  • Endpoint detayında ilgili iznin yanındaki kaldır butonuna tıklayın.

İpucu: Eğer aynı izin kümesine sahip çok sayıda endpoint varsa, bu endpoint'leri bir Endpoint Grubuna dahil etmek ve gruba izin tanımlamak daha pratik olacaktır. Bu özellik şu an geliştirme aşamasındadır ve ilerleyen sürümlerde kullanıma açılacaktır.


6.6 Endpoint Grupları​

⚠️ Bu özellik henüz aktif değildir. Endpoint Grupları özelliği gelecek sürümlerde geliştirilecek ve kullanıma açılacaktır. Aşağıdaki bilgiler planlanan işlevselliği tanıtmak amacıyla verilmiştir.

Endpoint grupları, birden fazla endpoint'i mantıksal olarak bir araya getirmenizi sağlayacaktır. Bir gruba atanan izin, o gruba dahil tüm endpoint'ler için geçerli olacaktır.

Grup bazlı izin tanımlamanın avantajı (planlanan):

  • Products grubuna products.manage iznini bir kez tanımlamak yeterli olacaktır; grup altındaki tüm endpoint'ler bu izni miras alacaktır.
  • Yeni bir endpoint eklendiğinde, sadece gruba dahil etmek yeterli olacak; tek tek izin ataması gerekmeyecektir.

7. İzin Denetimi: Akış Şeması​

Bir kullanıcının herhangi bir endpoint'e erişmeye çalıştığında sistemin nasıl karar verdiğini gösteren akış:


8. Önbellekleme (Caching)​

MMX Permissions, veritabanı sorgularını minimize etmek için bir önbellekleme katmanı kullanır. Bu sayede her HTTP isteğinde veritabanına gidilmez.

Önbelleklenen Veriler ve Süreleri​

VeriÖnbellek AnahtarıSüre
Kullanıcı izin kodlarıuser_permission_codes:{userId}30 dakika
Kullanıcı rolleriuser_roles:{userId}15 dakika
Endpoint izinleriendpoint_permissions:{controller}:{action}1 saat
Endpoint grup izinleriendpoint_group_permissions:{group}1 saat

Önbelleği Geçersiz Kılma​

Aşağıdaki durumlarda ilgili önbellek verisi otomatik olarak süresi dolduğunda yenilenir. Değişikliklerin anında yansımasını istiyorsanız uygulamayı yeniden başlatmak gerekebilir veya geliştirici ekibiniz özel invalidation mekanizması kurmuş olabilir:

  • Bir role yeni izin eklendiğinde veya izin kaldırıldığında
  • Bir endpoint'in izin tanımları değiştiğinde
  • Kullanıcının rol atamaları değiştiğinde

9. Güvenlik​

MMX Permissions, çok katmanlı bir güvenlik modeli uygular:

Kimlik Doğrulama​

  • Tüm yönetim sayfaları ve API endpoint'leri için geçerli bir JWT Bearer token zorunludur.
  • Yönetim arayüzü ek olarak OpenID Connect ile kimlik doğrulaması yapar.

Yetkilendirme (Çok Katmanlı)​

KatmanKontrol
UI KatmanıRazor Pages: admin rolü zorunludur
API KatmanıTüm yönetim endpoint'leri: admin rolü zorunludur
Middleware KatmanıHer HTTP isteği için kullanıcı izinleri denetlenir

Öneriler​

  • Üretim ortamında AllowUnprotectedEndpoints değerini false olarak ayarlayın.
  • Bağlantı dizesini ve ClientSecret değerini her zaman ortam değişkeni veya secret yöneticisi üzerinden sağlayın; kaynak koduna veya appsettings.json'a düz metin olarak yazmayın.
  • HTTPS kullanımı zorunludur.
  • admin rolünü kimlik sağlayıcınızda yalnızca güvenilir kişilere atayın.

10. Sorun Giderme​

Yönetim arayüzüne erişemiyorum​

BelirtiOlası NedenÇözüm
Giriş sayfasına yönlendiriliyorumOturum açılmamışKimlik sağlayıcınız üzerinden giriş yapın
"Access Denied" sayfası görüyorumadmin rolünüz yokKimlik sağlayıcınızda kullanıcıya admin rolü atayın
Boş sayfa veya hataAuthority yanlış yapılandırılmışappsettings.json içindeki Authority URL'ini kontrol edin
Token kabul edilmiyorRoleClaimType uyuşmazlığıKimlik sağlayıcınızın gönderdiği rol claim adıyla RoleClaimType değerini eşleştirin

Kullanıcı izin gerektiren endpoint'e erişemiyor (403)​

  1. Roles ekranından kullanıcının sahip olduğu rolü kontrol edin.
  2. İlgili rolün gerekli izne sahip olduğunu doğrulayın.
  3. Endpoints veya Endpoint Groups ekranından endpoint'e doğru iznin atandığından emin olun.
  4. Önbellekleme nedeniyle değişiklikler en fazla 30 dakika içinde yansır; acil durumlarda uygulamayı yeniden başlatın.

Endpoint listesinde görünmesi gereken bir endpoint yok​

  • Uygulamanın en az bir kez çalıştırılmış ve ilgili endpoint'in route tablosuna kaydedilmiş olması gerekir.
  • Middleware, endpoint'leri uygulama başlangıcında otomatik olarak keşfeder; bu nedenle yeni eklenen endpoint'lerin görünmesi için uygulamanın yeniden başlatılması gerekebilir.

Veritabanına bağlanamıyor​

  1. ConnectionString değerinin doğru ve erişilebilir olduğunu kontrol edin.
  2. DatabaseProvider değerinin veritabanı türüyle (SqlServer veya PostgreSQL) eşleştiğinden emin olun.
  3. Geliştirme ortamında DevelopmentStartupDelayMs değerini artırarak veritabanının hazır olmasını bekleyebilirsiniz.

Bu kılavuz MMX Permissions kütüphanesinin son sürümüne aittir. Kütüphane güncellendiğinde bu belge de güncellenecektir.