
Github Proje: AyazDuru.Samples.Keycloak
Keycloak Nedir?
Düşün ki uygulamana giriş ekranı eklemek istiyorsun. Kullanıcılar şifreyle girecek, belki Google ya da GitHub ile de giriş yapabilsin istiyorsun. Bir de kimin hangi sayfayı göreceğine karar vermen lazım. Tüm bunları sıfırdan kodlamak var ya… hem zahmetli hem de hata riski çok yüksek.
İşte tam bu noktada Keycloak imdadına yetişiyor.
Keycloak, açık kaynaklı bir kimlik ve erişim yönetim aracı. Yani giriş–çıkış, roller, izinler, hatta Single Sign-On (tek oturum açma) gibi şeyleri senin yerine hallediyor. Sen de kafanı bu detaylarla meşgul etmeyip uygulamanın esas işine odaklanıyorsun.
Üstelik ücretsiz, modern protokolleri (OIDC, OAuth2, SAML) destekliyor ve Docker üzerinden saniyeler içinde kurulabiliyor. Yani hem profesyonel projelerde hem de lokal geliştirmelerde çok iş görüyor.
Kısaca: “Kullanıcı yönetimi, yetkilendirme, güvenlik işlerini bana bırak” diyen, hayat kolaylaştıran bir çözüm.
ASP.NET Core’da kimlik doğrulama deyince akla ilk gelen yöntemlerden biri OpenID Connect (OIDC). Güvenli, standartlara uygun ve uğraşsız. Ama işin sıkıntısı şu: ASP.NET Core kendi başına bir OIDC sunucusu getirmiyor. Yani senin bir çözüm bulman gerekiyor.
İşte bu noktada Keycloak devreye giriyor. Hem ücretsiz hem de kendi makinenizde hızlıca ayağa kaldırabileceğiniz bir OIDC sağlayıcısı. ASP.NET Core uygulamanı Keycloak ile nasıl güvence altına alabileceğini, sıfırdan adım adım göstereceğim.
Keycloak’ın Avantajları
-
Açık kaynak ve ücretsiz: Lisans maliyeti yoktur, hem öğrenme hem de üretim ortamlarında rahatlıkla kullanılabilir.
-
Modern protokoller: OIDC, OAuth2, SAML gibi güncel standartları destekler. Uygulamaların uyumluluğu konusunda endişe yaşamazsınız.
-
Single Sign-On (SSO): Bir kez giriş yapıldığında tüm uygulamalarda geçerli olur. Özellikle kurumsal sistemlerde oldukça faydalıdır.
-
Kolay entegrasyon: ASP.NET Core, Java, Node.js gibi farklı platformlarla hazır entegrasyonları mevcuttur.
-
Yönetim arayüzü: Web tabanlı bir admin paneli sayesinde kullanıcı, rol ve izin yönetimini kolayca yapabilirsiniz.
-
Geniş topluluk desteği: Dünya çapında çok kullanılan bir proje olduğu için Stack Overflow ve GitHub üzerinde bol miktarda kaynak bulunur.
Keycloak’ın Dezavantajları
-
Karmaşık kavramlar: İlk kez kullananlar için realm, client, scope gibi terimler kafa karıştırıcı olabilir.
-
Kaynak tüketimi: Çalıştırıldığında CPU ve RAM kullanımı görece yüksek olabilir, küçük sistemlerde bu hissedilir.
-
Yönetim yükü: Kendi sunucunuzda barındırmak istediğinizde güncellemeleri, yedeklemeleri ve güvenlik yamalarını sizin takip etmeniz gerekir.
-
Basit projeler için ağır olabilir: Küçük veya hobi amaçlı projeler için fazla detaylı bir çözüm haline gelebilir.
1. Adım: Keycloak'ı Docker aracılığıyla çalıştırın
Docker Desktop'ı yüklediğinizden ve başlattığınızdan emin olun.
docker run --name keycloak -p 127.0.0.1:8080:8080 -v keycloak_data:/opt/keycloak/data -e KC_BOOTSTRAP_ADMIN_USERNAME=admin -e KC_BOOTSTRAP_ADMIN_PASSWORD=admin quay.io/keycloak/keycloak:26.3.3 start-dev
Şimdi tarayıcınızı açın ve şu sayfaya gidin.
http://localhost:8080/
kullanıcı adı: admin ve parola: admin bilgileriyle giriş yapın.

2. Adım: Bir Realm Oluştur
Keycloak Realm, aslında Keycloak dünyasında kendi özel alanınızı oluşturmak gibi bir şey. Kullanıcılarınızı, rollerinizi, gruplarınızı ve kimlik doğrulama ayarlarınızı tek bir yerde kolayca yönetebileceğiniz mantıksal bir alan sunuyor.

Yeni bir realm oluşturmak istiyorsanız, üstteki Manage realms linkinden “Create realm” seçeneğine tıklamanız yeterli.

e-commerce adında bir realm oluşturuyoruz.
3. Adım: Kullanıcı Oluşturma
Keycloak’ta kullanıcı yönetimi gerçekten çok kolay. Tek yapmanız gereken, sol menüden “Users” bölümüne gitmek ve “Create new user” butonuna tıklamak. Hepsi bu kadar!

Bir sonraki ekranda, kullanıcı bilgilerinizi giriyorsunuz. “Email verified” seçeneğini aktif hale getirirseniz işler daha kolay olur. Son olarak “Create” butonuna tıklayın, işlem tamam!

Şifre olarak "Password1@_!" olarak yazacağım. siz dilerseniz kendiniz belirleyebilirsiniz. Geliştirme ortamı için kullanacağımızdan çok önemli değil.
4. Adım: Back-End (Api) Ayarları
Keycloak’ın oluşturduğu access token’ların, back-end API’mize yapılan istekleri yetkilendirebilmesi için doğru “audience” (hedef) bilgisini içermesi gerekiyor. Bu sayede back-end , token’ın gerçekten kendisi için düzenlendiğinden emin olabiliyor.
Bunu sağlamak için, back-end tarafımızı Keycloak’ta bir client olarak kaydetmemiz gerekiyor. Bunun için “Client” sekmesine gidip, “Create client” butonuna tıklamanız yeterli. Ben ProductApiService ve NotificationApiService için kolaylık olsun diye, bu client'ı kullanacağım. Siz dilerseniz ayrı ayrı client oluşturabilirsiniz.

Genel ayarlar (General settings) adımında, bu client için anlamlı bir ID girmeniz gerekiyor. Ben örnek olarak "e-commerce-api" kullanıyorum. Siz de kendi uygulamanıza uygun bir isim verebilirsiniz!

Daha sonra bütün seçenekleri kapatıyoruz.

Son adımda herhangi bir bilgi girmenize gerek yok. Sadece “Save” butonuna tıklayın ve client’ınız başarıyla oluşturulmuş olacak.
5. Adım: Audience (Hedef) bilgisini yapılandırma
Doğru audience bilgisinin access token’lara eklenmesi için bir client scope oluşturmamız gerekiyor.
Bunun için “Client scopes” bölümüne gidin ve “Create client scope” butonuna tıklayın.

Client scope adını belirlerken, aslında bu ismin ne tür yetkileri kapsadığını açıkça anlatması gerekiyor. Yani bir istemci, bu scope'u talep ederse ona hangi izinler verileceğini ismin kendisiyle anlatabilmeliyiz. Kısacası, scope adı ne kadar açıklayıcı olursa hem geliştiricilerin işi kolaylaşır, hem de son kullanıcıların neye izin verdiğini anlaması daha rahat olur.

Ben, kapsamlı yetki gerektiren durumlar için scope adını e-commerce-api.all olarak seçtim. Çünkü bu scope, backend API’sinin tamamına erişim izni veriyor. Tabii ki, bu yetkinin gerçekten nasıl kullanılacağını ve sınırlarını, backendte tanımladığınız yetkilendirme politikalarıyla ayrıca kontrol edebilirsiniz.
Scope’u oluşturduktan sonra, 'Include in token scope' seçeneğini aktif etmeyi unutmayın. Böylece bu scope, ihtiyaç duyduğunuzda erişim token’ınıza eklenmiş olacak. Ayarları kaydedin ve bir sonraki adıma geçin.
Şimdi ise, bu scope’un talep edildiğinde token’da doğru bir audience (hedef uygulama) değeri üretmesini sağlamamız gerekiyor. Bunun için client scope detay ekranındayken, "Mappers" sekmesine geçiyoruz ve "Configure a new mapper" butonuna tıklıyoruz.

Mapper eklerken, açılan seçenekler arasında 'Audience' (Hedef Uygulama) seçeneğini bulup seçiyoruz. Böylece, oluşturduğumuz scope talep edildiğinde access token’da doğru audience değeri yer alacak. Kısacası, bu ayar sayesinde token’ın gerçekten hangi API’ye veya uygulamaya yönelik olduğunu net bir şekilde belirlemiş oluyoruz

Böylece, e-commerce-api.all scope’u her talep edilip onaylandığında, access token’a otomatik olarak e-commerce-api audience (hedef uygulama) değeri eklenmiş olacak. Artık bu ekranda yapmamız gereken başka bir şey yok; ayarları kaydediyoruz.
Şimdi sırada ikinci istemcimizi (front-end) kaydetmek var.
6. Adım: Front-end uygulamamızı kaydediyoruz
OIDC yetkilendirme kodu akışını (authorization code flow) kullanacağımız için, bu sürecin front-end uygulamamızdan başladığını unutmayalım. Dolayısıyla, öncelikle front-end’i Keycloak’a bir istemci (client) olarak kaydetmemiz gerekiyor.
Bunun için Keycloak’ta ‘Clients’ (İstemciler) bölümüne geri dönüyoruz ve ‘Create client’ (İstemci oluştur) butonuna tıklıyoruz. Bu adımda, front-end uygulamanızın Keycloak ile güvenli bir şekilde iletişim kurabilmesi için gerekli temel ayarları yapacağız.

Genel ayarlar ekranında, front-end uygulamanız için anlamlı ve kolay hatırlanacak bir ID belirleyin. Bu ID’yi ileride uygulama kodunuzda kullanacağınız için, projenizle alakalı ve açıklayıcı bir isim seçmenizde fayda var. Kısacası, ileride karışıklık yaşamamak için bu kimliği özenle seçmek işleri çok daha kolaylaştıracak.

Capability config (Yetenek yapılandırması) adımında, 'Client authentication' (İstemci kimlik doğrulama) ayarı, kullandığınız istemci tipine göre Açık (On) veya Kapalı (Off) olarak değişiyor:
-
Public client (Açık): Burada 'Client authentication' ayarını Açık (On) konumuna getiriyoruz. Bu tip istemciler, React, Angular, Blazor WASM gibi SPA (Single Page Application) tarzı uygulamalar veya mobil uygulamalar oluyor. Çünkü kullanıcının cihazında çalışan bir uygulamada gizli anahtarları (secret) güvenli bir şekilde saklamak mümkün değil; sonuçta kullanıcı cihazına erişebildiği için her şey kolayca çözülebilir.
-
Private client (Kapalı): Eğer uygulamanız sunucu tarafında çalışıyorsa, örneğin Blazor Server, eski tip ASP.NET MVC ya da Razor gibi uygulamalarda, 'Client authentication' ayarını Kapalı (Off) olarak bırakabilirsiniz. Çünkü bu tip uygulamalar, gizli anahtarları güvenli bir şekilde sunucuda tutabiliyor ve dışarıdan erişilemiyor.
Kısacası, istemci tipinizi doğru seçmek, güvenlik açısından oldukça önemli. Uygulamanızın nerede ve nasıl çalıştığını göz önünde bulundurarak bu ayarı düzenlemekte fayda var.

Benim örneğimde, front-end uygulamam Blazor Interactive Auto (Server ➝ WASM geçişli) render modunda çalışıyor. Bu yüzden 'Client authentication' ayarını Açık (On) konumuna getiriyorum.
Kimlik doğrulama akışı olarak ise, 'Standard flow' bizim için fazlasıyla yeterli oluyor. Ekstra karmaşıklığa gerek yok!
Şimdi giriş (Login) ayarlarına geçiyoruz. Burada dikkat etmemiz gereken şey, 'Valid redirect URIs' ve 'Valid post logout redirect URIs' alanlarını doğru şekilde doldurmak. Yani, kullanıcı başarılı bir şekilde giriş yaptığında veya çıkış yaptığında yönlendirileceği adresleri buraya yazıyoruz. Bunlar uygulamanızın güvenli ve sorunsuz bir şekilde oturum yönetimi yapabilmesi için çok önemli.

Blazor Interactive Auto render modunda, uygulama hem Server hem de WebAssembly (WASM) tarafında çalıştığı için Keycloak client ayarlarında aşağıdaki URI'leri eklemelisiniz:
- Server-side için:
https://localhost:5001/signin-oidc (login)
https://localhost:5001/signout-callback-oidc (logout)
- WebAssembly (WASM) için:
https://localhost:5001/authentication/login-callback (login)
https://localhost:5001/authentication/logout-callback (logout)
Ayrıca Web origins olarak da https://localhost:5001 adresini eklemeyi unutmayın.
Keycloak "Valid redirect URIs" Açıklaması
| URI Adresi |
Açıklama |
Kullanım Yeri |
https://localhost:5001/signin-oidc |
Blazor Server tarafında OIDC authentication için kullanılır |
Server |
https://localhost:5001/authentication/login-callback |
Blazor WASM authentication flow login callback adresi |
WebAssembly (WASM) |
https://localhost:5001/authentication/logout-callback |
Blazor WASM logout işlemi sonrası callback adresi |
WebAssembly (WASM) |
Keycloak "Valid post logout redirect URIs" Açıklaması
| URI Adresi |
Açıklama |
Kullanım Yeri |
https://localhost:5001/signout-callback-oidc |
Blazor Server logout işlemi sonrası callback adresi |
Server |
Burada kullanacağınız host ve port, front-end uygulamanızı yerel olarak hangi adreste çalıştırdığınıza göre değişiyor. Benim örneğimde bu adres http://localhost:5001 olduğu için ayarları ona göre yaptım.
Kolaylık olsun diye, ASP.NET Core’un OIDC middleware’inin varsayılan yollarını kullandım: signin-oidc ve signout-callback-oidc. Tabii, dilerseniz farklı yollar da kullanabilirsiniz; ama kullandığınız yolların front-end’de gerçekten tanımlı olduğundan ve OIDC middleware’in bu yolları bildiğinden emin olmalısınız.
Ayarları kaydedin, böylece front-end’iniz büyük ölçüde hazır hale gelmiş oluyor.
Son bir eksik kaldı: Front-end’inizin daha önce oluşturduğumuz client scope’u talep edebilmesi gerekiyor. Ancak bu şekilde doğru audience bilgisiyle access token alabilir.
Bunun için front-end ekranında 'Client scopes' bölümüne gidiyoruz ve 'Add client scope' (İstemci kapsamı ekle) butonuna tıklıyoruz:

Oluşturduğunuz kapsamı (benim örneğimde e-commerce-api.all) listeden seçin, 'Add' (Ekle) butonuna tıklayın ve ardından bu scope'un 'Default' (Varsayılan) mı yoksa 'Optional' (İsteğe bağlı) mı olacağını seçin.
Eğer scope’u ‘Default’ olarak ayarlarsanız, istemci her access token istediğinde bu kapsam otomatik olarak token’a eklenir. ‘Optional’ seçerseniz, istemci sadece özel olarak bu scope’u talep ettiğinde token’a eklenir.
Hangisi uygulamanızın ihtiyacına uygunsa onu seçip işlemi tamamlayabilirsiniz.

7. Adım: ASP.NET Core Back-end Yapılandırması
Artık Keycloak tarafındaki işlemler tamam! Sırada, ASP.NET Core ile geliştirdiğimiz back-end API’mizi Keycloak ile entegre etmek var. Böylece, API’miz sadece geçerli ve doğru yetkilerle donatılmış access token’ları kabul edecek; güvenliği sağlamak için Keycloak ile tam uyumlu çalışacak.
Bu aşamada genellikle şunları yapıyoruz:
- API projemize gerekli NuGet paketini (Microsoft.AspNetCore.Authentication.JwtBearer) ekliyoruz.
- appsettings.json veya ilgili yapılandırma dosyasında Keycloak sunucu bilgilerini (URL, realm, client ID vb.) tanımlıyoruz.
- Startup.cs veya Program.cs dosyasında JWT doğrulamasını ve yetkilendirmesini ayarlıyoruz.
- Doğru audience (hedef uygulama) bilgisinin kontrol edildiğinden emin oluyoruz.
Bu adımları tamamladıktan sonra, API’niz yalnızca Keycloak’tan alınan ve tanımladığınız scope ile yetkilendirilmiş token’ları kabul edecek şekilde çalışmaya başlar.
Şimdi, bu teknik yapılandırmanın nasıl yapıldığına örneklerle bakalım!
//appsettings.json
{
"JwtBearer": {
"Authority": "http://localhost:8080/realms/e-commerce",
"Audience": "e-commerce-api",
"RequireHttpsMetadata": false
}
}
//Program.cs
// appsettings.json'dan ayarları çekiyoruz
var jwtSettings = builder.Configuration.GetSection("JwtBearer");
// JWT Bearer authentication ekle
builder.Services.AddAuthentication(JwtBearerDefaults.AuthenticationScheme)
.AddJwtBearer(options =>
{
options.Authority = jwtSettings["Authority"];
options.Audience = jwtSettings["Audience"];
options.RequireHttpsMetadata = bool.Parse(jwtSettings["RequireHttpsMetadata"] ?? "true");
options.TokenValidationParameters = new Microsoft.IdentityModel.Tokens.TokenValidationParameters
{
// Keycloak tokenlarında "aud" (audience) kontrolü için
ValidateAudience = true
};
});
builder.Services.AddAuthorizationBuilder();
Keycloak konfigürasyonunda “Authority” aslında Keycloak’ın çalıştığı sunucu adresini (host:port) ve ona ek olarak realm adını (/realms/your-realm-name) ifade ediyor. “Audience” ise, Keycloak üzerinde daha önce tanımladığımız değer ile birebir aynı olmalı; yani burada dikkatli olmalıyız, küçük bir farklılık bile doğrulamanın başarısız olmasına neden olabilir.
Geliştirme ortamında Keycloak genellikle HTTPS olmadan çalıştığı için, “RequireHttpsMetadata” ayarını “false” yapmamız gerekiyor. Bu sayede middleware, Keycloak sunucusuyla güvenli olmayan bağlantı üzerinden iletişim kurabiliyor.
Son olarak, yetkilendirme (Authorization) middleware’ini aktif hale getirmek için .AddAuthorizationBuilder() eklemeyi unutmayın.
8. Adım: Front-end Ayarları
Front-end OIDC (OpenID Connect) ile yapılandırmak, kullandığınız teknolojiye göre oldukça değişken olabilir. Fakat Blazor uygulamaları için temel adımlar şöyle:
İlk olarak, OIDC middleware’ine erişebilmek için Microsoft.AspNetCore.Authentication.OpenIdConnect NuGet paketini projeye eklememiz gerekiyor. Bu paket, Keycloak ile güvenli kimlik doğrulama işlemlerini kolaylaştırıyor.
Sonrasında, uygulamanızın başlangıcında Keycloak şemasını (scheme) yapılandırmak için gerekli ayarları ekleyin. Böylece, Keycloak ile olan bağlantımızı ve kimlik doğrulama süreçlerimizi sağlıklı bir şekilde yönetebiliriz.
//appsettings.json
"Authentication": {
"Keycloak": {
"Scheme": "Keycloak",
"Authority": "http://localhost:8080/realms/e-commerce",
"ClientId": "e-commerce-frontend",
"ClientSecret": "dYfCtSZ8W9nOXf7LlEUN8z8DXAWvnY4b",
"ResponseType": "code",
"Scopes": [ "e-commerce-api.all" ],
"RequireHttpsMetadata": false
}
},
"ProductApiUri": "http://localhost:5002",
"NotificationApiUri": "http://localhost:5003",
appsettings.json dosyamıza yukarıdaki satırları ekliyoruz.
//Program.cs
var keycloakConfig = builder.Configuration.GetSection("Authentication:Keycloak");
var scheme = keycloakConfig["Scheme"];
var clientId = keycloakConfig["ClientId"];
var clientSecret = keycloakConfig["ClientSecret"];
var authority = keycloakConfig["Authority"];
var responseType = keycloakConfig["ResponseType"];
var requireHttpsMetadata = bool.Parse(keycloakConfig["RequireHttpsMetadata"] ?? "false");
var scopes = keycloakConfig.GetSection("Scopes").Get<string[]>() ?? Array.Empty<string>();
var authBuilder = builder.Services.AddAuthentication(scheme);
authBuilder.AddOpenIdConnect(
authenticationScheme: scheme,
options =>
{
options.ClientId = clientId;
options.ClientSecret = clientSecret;
options.Authority = authority;
foreach (var scope in scopes)
{
options.Scope.Add(scope);
}
options.ResponseType = responseType;
options.SaveTokens = true;
options.SignInScheme = CookieAuthenticationDefaults.AuthenticationScheme;
options.SignOutScheme = scheme;
options.RequireHttpsMetadata = requireHttpsMetadata;
options.TokenValidationParameters.NameClaimType = JwtRegisteredClaimNames.Name;
options.MapInboundClaims = false;
}).AddCookie(CookieAuthenticationDefaults.AuthenticationScheme);
- ClientId ve ClientSecret: Keycloak’ta oluşturduğun istemcinin kimlik bilgileri.
- Authority: Keycloak sunucunun adresi ve ilgili realm’in yolu. Örneğin:
http://localhost:8080/realms/e-commerce
- Scope: Daha önce tanımladığın ve doğru yetkiyi veren kapsam.
- ResponseType: Burada
Code olarak ayarlanmış; yani Authorization Code Flow kullanılıyor.
- SaveTokens: Token’ların saklanmasını sağlıyor, böylece backend’e istek atarken kolayca kullanabiliyorsun.
- SignInScheme: Kullanıcı oturumunu cookie ile yönetiyor, böylece kullanıcı giriş yaptıktan sonra sayfa yenilense bile oturumu devam ediyor.
- SignOutScheme: Kullanıcı çıkış yaptığında hem Keycloak’tan hem de uygulamanın ön yüzünden çıkış yapılıyor.
- RequireHttpsMetadata: Geliştirme ortamında genellikle HTTPS kullanılmadığı için
false olarak ayarlanıyor.
- TokenValidationParameters.NameClaimType: Kullanıcı doğrulandıktan sonra claim principal’da ismin düzgün şekilde gelmesini sağlıyor.
- MapInboundClaims: ASP.NET Core’un bazı claim adlarını değiştirmesini engelliyor; Keycloak’tan gelen claim’ler aynen korunuyor.
- Geliştirme ortamında HTTPS zorunlu olmadığı için
RequireHttpsMetadata değerini false yapmayı unutma.
- Doğru scope ve audience ayarlarını Keycloak’ta önceden tanımlamalısın.
Program.cs dosyasına Microsoft.AspNetCore.Authentication.OpenIdConnect kütüphanesini ekledikten sonra, AddOpenIdConnect methodunu kullanıyoruz. Blazor'da diğer ayarlar için projeyi inceleyebilirsiniz.
ClientId ve ClientSecret bilgilerinizi Keycloak üzerinde oluşturduğunuz frontend istemci konfigürasyonundan kolayca alabilirsiniz. Keycloak yönetim panelinde ilgili uygulamanızı seçip, gerekli alanları bulmanız yeterli.

9. Adım: Herşey tamam, Artık Blazor, API'ler ve Keycloak birlikte çalışıyor.
Blazor Interactive Auto (Server ➝ WASM geçişli) proje olduğu için, ben webassembly client üzerinden gelen istekleri ilk olarak Blazor server side'a oradan sonra API'lere aktarıyorum. Projeyi inceleyip tam olarak nasıl çalıştığına bakabilirsiniz. Dilerseniz direkt front-end client tarafında API'leri public gibi düşünüp, oradan http requestleri yapabilirsiniz. Bu projede API'ler public olarak dışarıya açık şekilde olmadığı bir varsayımı üzerinden gidilmiştir.
DotnetCore.CAP (Outbox Pattern için) RabbitMQ kurulu olduğuna emin olun. Dilerseniz RabbitMQ ile ilgili blog yazımı inceleyebilirsiniz. Bknz. .NET ile RabbitMQ Kullanımı (MassTransit, RabbitMQ.Client Kod Örnekleriyle)
Hızlıca RabbitMQ Kurulumu
docker run -d --name rabbitmq -p 5672:5672 -p 15672:15672 -v rabbitmq_data:/var/lib/rabbitmq -e RABBITMQ_DEFAULT_USER=admin -e RABBITMQ_DEFAULT_PASS=admin rabbitmq:3-management
Şimdi Docker Dekstop üzerinden keycloak ve rabbitmq containerlarını durdurabiliriz.
Solutiondaki AyazDuru.Samples.Keycloak.AppHost projesini çalıştırdığımızda gerekli containerlar oluşturulacak. Front-end ve back-end sunucuları başlatılacaktır.

Başlattıktan sonra gördüğünüz gibi containerlar oluşmaya başladı.

.NET Aspire ekranın son görüntüsü .NET Aspire ile alakalı daha detaylı bilgi için blog yazımı inceleyebilirsiniz.
Bknz. .NET Aspire Nedir? Neden Kullanılır?

Blazor (Front-end) ekranı:

Login butonuna bastıktan sonra:

Blazor User Claims sayfası:

Blazor Product sayfası:

Product Api:

Notification API:

İyi çalışmalar, sağlıcakla kalın.