ErtisAuth
Açık kaynak · MIT · .NET 10

Kimlik ve Erişim Yönetimi

Doğru kimlik, doğru erişim, güçlü güvenlik_

ErtisAuth, platform farketmeksizin web, native, mobil, Web API gibi tüm uygulamalarınızda ve servislerinizde kimlik doğrulamak ve yetkilendirmek için merkezi, ölçeklenebilir, güvenli bir çözüm sunar. Token'lar, üyelik alanları, roller, ayrıntılı ve esnek yetki yönetimi, dinamik kullanıcı tür yönetimi, OAuth entegrasyonları; hepsi tek çatı altında.

Hafif

Tek servis, tek veri tabanı. JVM yok, ayrı bir yönetim sunucusu yok, SQL migration'ları yok.

API öncelikli

Membership'ler, kullanıcılar, roller, sağlayıcılar ve hook'lar, token'ları üreten aynı REST API üzerinden yönetilir.

Üyelik alanları

Her membership izole bir alandır. Birden fazla mecrayı ve ürün ekosistemini tek servis altında güvenle birbirlerinden izole şekilde yönetebilirsiniz.

Ücretsiz ve açık

MIT lisanslı. Ücretsiz, herhangi bir kısıtlama olmadan; verileriniz kendi veritabanınızda kalır.

Özellikler

Bir kimlik servisinin ihtiyaç duyduğu her şey

ErtisAuth, kimlik ve yetki yönetiminden olay tabanlı entegrasyonlara kadar hesap yaşam döngüsünün tamamını kapsar.

Token'lar ve kullanıcı oturumları

Kullanıcılar için JWT bearer, uygulamalar için Basic token'lar; varsayılan olarak tek kullanımlık refresh token'lar, oturum bazında ya da tüm cihazlarda iptal ve yetkilerin bir alt kümesiyle sınırlı scoped token'lar üretebilirsiniz.

bearer
JWT
basic
app_id:secret
refresh
single-use
scoped
users.read
generate-tokenrefresh-tokenrevoke-token

Membership'ler

Birbirinden izole üyelik alanları; her birinin kendi kullanıcıları, rolleri, uygulamaları, gizli anahtarı, token süreleri ve mail ayarları vardır.

RBAC ve UBAC

İzin ve yasak kuralları içeren roller için RBAC (Role Based Access Control) ve üstüne kullanıcı ve uygulama bazında UBAC (User Based Access Control) istisnalar. Aynı model kendi API'lerinizi de korur.

Harici sağlayıcılar

Google, Apple (web ve native), Facebook ve Microsoft ile giriş. Sağlayıcı token'ları sunucuda doğrulanır; istemciden gelen kimliğe asla tek başına güvenilmez.

Google
Google
Facebook
Facebook
Facebook (limited)
Facebook (limited)
Apple
Apple
Apple (native)
Apple (native)
Microsoft
Microsoft

Dinamik kullanıcı tipleri

Kullanıcıların özel alanlarını çalışma zamanında JSON şemasıyla tanımlayarak kendi kullanıcı türlerinizi oluşturun. Doğrulama, varsayılan değerler, tekil alanlar, kalıtım, nesne ve dizi şablonları; üstelik kod değiştirmeden.

Cihazlarla giriş

Akıllı TV'ler, kiosk'lar ve CLI araçları için güvenli kod akışı: cihaz kısa bir kod gösterir, giriş yapmış bir kullanıcı onaylar, cihaz token'ını alır.

K7QF-X2MP
Giriş yapıldı
K7QF-X2MPOnayla
Onaylandı

Hesap yaşam döngüsü

E-posta ile aktivasyon, tek kullanımlık token'larla şifre sıfırlama, tek kullanımlık şifreler (OTP) hesap dondurma veya tüm token'larını tek seferde iptal etme.

Modern şifre saklama

Membership bazında seçilen Argon2id ve PBKDF2. Eski algoritmalar da desteklenir; mevcut kullanıcı veritabanları içeri aktarılabilir.

Desteklenen algoritmalar;
MD5
SHA1
SHA2_224
SHA2_256
SHA2_384
SHA2_512
SHA2_512_224
SHA2_512_256
SHA3_224
SHA3_256
SHA3_384
SHA3_512
ARGON2ID
PBKDF2_SHA256
PBKDF2_SHA512

Olaylar ve hook'lar

Her işlem bir olay olarak kaydedilir. Webhook'lar arka plandaki bir kuyruktan endpoint'lerinizi çağırır, mail hook'lar ile SMTP sunucunuz üzerinden veya SendGrid, MailChimp gibi sağlayıcılar üzerinden hook postaları gönderebilirsiniz.

TokenGenerated→webhook200
UserCreated→mail hooksent
UserCreated→webhook200

Production'a hazır

Scalar ile OpenAPI referansı, Prometheus metrikleri, Application Insights monitoring, health check'ler ve root olmayan kullanıcıyla çalışan bir Docker imajı.

Yetki modeli

Dört bölüm, her kaynak

RBAC, kimin hangi kaynak üzerinde ne yapabileceğini söyleyen bir ifadedir. Joker karakterler ve kısa yazımlar rolleri sade tutar; aynı ifadeler kendi servislerinizi de korur. Basit ve kapsayıcı.

*.orders.read.{id}
subject
İşlemi yapan: bir kullanıcı ya da uygulama id'si
resource
Kaynağın türü, örneğin 'users' ya da 'orders'
action
create, read, update, delete ya da özel bir işlem
object
Tek bir belirli kaynağın id'si

Bir istek nasıl yetkilendirilir?

  1. 1

    Önce, eşleşen bir kullanıcı ya da uygulama için tanımlı bir yetki tanımı (izin veya yasak) olup olmadığı kontrol edilir.

  2. 2

    Yoksa kullanıcı ya da uygulamanın bağlı olduğu role göre karar verilir; rolün yasak kuralı her zaman kazanır.

  3. 3

    Rol yasaklamadıkça kullanıcılar kendi kayıtlarını okuyabilir ve güncelleyebilir.

  4. 4

    Sınırlı bir scoped token'ın scope'ları da isteği kapsamalıdır.

Örnek

İstek

GET users/42

Kullanıcı: u-7 · Rol: editor

Gereken yetki

u-7.users.read.42

Kullanıcı yetkileri (u-7)

  • +*.orders.read.*

Rol yetkileri (editor)

  • +*.users.read.*
  • +*.roles.read.*
  • +*.users.update.*
  • −*.users.delete.*
…

Güvenlik

Yerleşik, güvenli varsayılanlar

Bir kimlik servisi, varsayılan ayarları kadar güvenlidir. Bu korumalar ErtisAuth'ta her membership'in bir parçası ve ilk kurulumdan itibaren açık, ayrıca etkinleştirmeniz gereken bir şey yok.

Kimlik doğrulama

  • Membership bazında seçilen ARGON2ID ya da PBKDF2 ile şifre saklama, ayrıca legacy algoritmalar için destek
  • Sağlayıcı token'ları sunucuda sağlayıcıya doğrulatılır; doğrulanmamış bir e-posta mevcut bir hesaba asla bağlanmaz
  • Refresh token'lar varsayılan olarak tek kullanımlıktır
  • Şifre değişince kullanıcının diğer tüm cihazlardaki oturumları kapanır

İzolasyon

  • Bir membership'in token'ı diğer tüm membership'lerde reddedilir
  • Rolü olmayan kullanıcı ve uygulamalar reddedilir; varsayılan olarak asla izin verilmez
  • Scoped token'lar kendi scope'larının dışına çıkamaz
  • Her membership token'larını en az 32 baytlık kendi gizli anahtarıyla imzalar
  • Tüm sorgular yalnızca kendi membership'i üzerindeki izole alanda çalışır

Veri ve sorgular

  • Sorgular için script ve enjeksiyon koruması
  • Şifre hash'leri ve secret'lar okunamaz, bunlara göre filtrelenemez ya da sıralanamaz
  • Beklenmeyen hatalar genel bir mesaj döner; ayrıntılar log'larda kalır
  • Olay kayıtları ve webhook'lar token ya da secret taşımaz

Kodlar ve secret'lar

  • Tek kullanımlık şifreler ve cihaz kodları güvenli kriptografik süreçlerde üretilir
  • Tek kullanımlık şifreler tam anlamıyla tek kullanımlıktır ve deneme sayısı kontrolü uygulanır
  • Cihazla girişte, cihazın sorgularken kullandığı gizli kod, kullanıcının girdiği koddan ayrı tutulur ve hash'lenerek saklanır
  • Her uygulamanın kendine ait tekil bir secret'ı vardır

ErtisAuth'un sorumluluğunda olmayan konular

TLS, açık endpoint'lerde rate limiting ve ağ erişimi, gateway'inizin ve altyapınızın sorumluluğundadır.

.NET geliştiricileri için

ErtisAuth SDK. Uygulamalarınızı ve API'lerinizi entegre etmenin en kolay yolu

ErtisAuth.Sdk, ErtisAuth API'si için tipli bir istemcidir. ErtisAuth.Sdk.AspNetCore ise kendi ASP.NET Core servislerinize sadece birkaç basit adımda kimlik doğrulama ve yetki kontrolü ekler.

  • Kaynağı, işlemi ve nesneyi attribute'larla tanımlayın; placeholder'lar route değerlerini, query parametrelerini, header'ları ve ortam değişkenlerini okuyabilir.

  • Pakete dahil Roslyn analyzer'ı ile hatalı yetki attribute'larını derleme sırasında farkedin.

  • .NET kullanmıyor musunuz? Sorun değil, ErtisAuth'taki her özellik bir REST endpoint'i; tüm dillerde ve platformlardaki tüm uygulamalarınızda HTTP üzerinden kimlik doğrulayabilir ve yetki kontrol edebilirsiniz.

[Authorized]
[RbacResource("orders")]
[Route("orders")]
public class OrdersController : ControllerBase
{
	[HttpGet("{id}")]
	[RbacObject("{id}")]
	[RbacAction(Rbac.CrudActions.Read)]
	public IActionResult Get(string id)
	{
		// Yalnızca çağıranın token'ı *.orders.read.{id} yetkisini veriyorsa buraya ulaşılır
		...
	}
}

NuGet paketleri

ErtisAuth.SdkSürüm v0.0.0
NuGet

ErtisAuth API'si için tipli bir .NET istemcisi

dotnet add package ErtisAuth.Sdk
ErtisAuth.Sdk.AspNetCoreSürüm v0.0.0
NuGet

ASP.NET Core servisleriniz için kimlik doğrulama ve yetki kontrolü

dotnet add package ErtisAuth.Sdk.AspNetCore

Karşılaştırma

Bir kütüphane ile bir platform arasında

ErtisAuth, büyük platformlar gibi merkezi ve kurulduğu gibi çalışan bir sunucudur; ama kendi servislerinizin yanında çalışacak kadar hafiftir.

VS Keycloak

Kapsamlı bir sunucu ama ağır bir Java uygulaması ve ayarlarının çoğu yönetim konsolunda. ErtisAuth realm fikrini (membership'ler) korur ve tamamen API üzerinden yönetilen küçük bir .NET servisi olarak sunar.

VS Auth0, Okta ve barındırılan servisler

Sizin yerinize yönetilir, ama aktif kullanıcı başına ücretlendirilir ve kullanıcı verileriniz üçüncü bir platformda durur. ErtisAuth kendi sunucunuzda çalışır: veriler veritabanınızda kalır.

VS Duende IdentityServer

Kendi sunucunuzu yazmanız için bir framework ve çoğu şirket için ticari lisans gerektirir. ErtisAuth, MIT lisanslı ve kurulduğu gibi çalışan bir sunucudur.

VS ASP.NET Core Identity

Her uygulamaya gömülen bir kütüphane. ErtisAuth ise merkezi bir servistir: farklı dillerde yazılmış pek çok uygulama aynı kullanıcıları ve yetkileri dağıtık bir yapıda paylaşabilir.

Başlangıç

Birkaç dakikada çalışır halde

ErtisAuth'u ve MongoDB'yi Docker Compose ile başlatın, tek seferlik setup endpoint'iyle ilk membership'i oluşturun ve giriş yapın.

  1. 1

    Container'ları başlatın

    Repo'nun kök dizininden. API varsayılan olarak 9716 portunda çalışır, API referansı /docs adresindedir.

    $ git clone https://github.com/ertugrulozcan/ErtisAuth.git
    $ cd ErtisAuth
    $ docker compose up -d --build
  2. 2

    Kurulumu yapın

    Veritabanına bir setup token'ı ekleyin, ardından ilk membership'i, rolü ve yöneticiyi oluşturmak için /setup'ı bir kez çağırın.

    $ openssl rand -hex 32
    $ docker compose exec mongo mongosh auth \
    	--eval 'db.setup.insertOne({ token: "<setup_token>" })'
    $ curl -X POST http://localhost:9716/setup \
    	-H 'X-Setup-Token: <setup_token>' \
    	-H 'Content-Type: application/json' \
    	-d '{ "membership": { … }, "user": { … } }'
  3. 3

    İlk token'ınızı alın

    Yönetici kullanıcıyla giriş yapın ve access token'ı herhangi bir endpoint'te kullanın.

    $ curl -X POST http://localhost:9716/generate-token \
    	-H 'X-Ertis-Alias: <membership_id>' \
    	-H 'Content-Type: application/json' \
    	-d '{ "username": "admin", "password": "<password>" }'

Topluluğa katkı sağlama

ErtisAuth, MIT lisansıyla ücretsiz ve açık kaynaklı bir özgür yazılım projesidir. Repo'ya yıldız verin, dokümantasyonu okuyun ya da bir issue açın.