.Net 6.0 ve IdentityServer v4 ile Merkezi Login Sistemi (SSO)

Bu gönderide .bir net kütüphanesi olan identityserver ile authentacion işlemlerimizi yaptığımız merkezi bir giriş sistemi yapacağız ve farklı clientlarımız bu ortak girişi kullanacak.

SSO (Single Sign-On) Nedir?

Kimlik ve parola bilgilerimizin tek bir tarafta kontrol edilip tek bir yerden oturum açmamıza imkan sağlar. Mesela google, microsoft, facebook gibi şirketlerin farklı uygulamaları için yeni bir kullanıcı yada şifre eklemiyoruz tek bir kullanıcı adı ve şifre ile diğer uygulamalara erişebiliyoruz.

Projemizin yapısı

İki farklı proje açacağız, biri merkezi giriş yapacağımız .net 6 ve identityserver kullandığımız proje diğeri de .net mvc client’ımız olacak

Geliştirme Ortamı
  • Windows 11
  • Visual Studio 2022
  • .Net 6.0
Projenin Başlangıcı

SSO için login page ve diğer identity işlemleri bu projede olacağından .net 6.0 mvc seçenekleriyle projemi oluşturuyorum.

Kullanıcılarımızı saklayacağımız bir veritabanına ihtiyacımız var bunun için öncelikle entityframework ve veritabanı ayarlarını yapmalıyız.

Aşağıdaki paketleri yükleyelim :

EntityFrameworkCore.SqlServer : veritabanı sağlayıcımız sql server dependy injection yapar,
EntityFrameworkCore.Tools : migration komutları için.

DbContext dependy injection /Program.cs

DbContext‘ten miras alınan context sınıfını burada kaydediyoruz, veritabanı sağlayıcısı olarak da Sql Server‘ı ekledik.

ApplicationContext.cs

AddDbContext kısmında options nesnesini kullanabilmek için Context sınıfının constrcutorında mutlaka DbContextOptions<T> implement etmeleyiz.

Kullanıcı entitysini tanımlayalım: User.cs

Id otomatik artan şeklinde tanımladık.

SqlServer için appSetting.json‘da connection stringini yazalım.

ApplicationContext’e user’ı ekleyelim.

Migration kısmına geçerek veritabanını oluşturabiliriz

migrationlarla ilgili daha fazla bilgi için şu linke göz atabilirsiniz.

Sql Server Management Studio ile veritabanını kontrol edebiliriz

IdentityServer

Ana konumuz olan identity server ayarlarını yapalım. Öncelikle aşağıdaki paketleri yükleyelim.

Program.cs’ye identity server ile ilgili aşağıdaki ayarları ekleyelim

iki tane store edeceğimiz bilgileri ekledik, Bu store’ların kendine ait contextleri var.

  • ConfigurationStore: adından anlaşılacağı gibi clients, resources ve cors gibi ayarları depolamaya yarar
  • OperationalStore: grants, consents, and token gibi authorization ayarlarını saklıyor

AddDeveloperSigningCredential: IdentityServer doğrulama ve imzalama için bazı anahtarlamalar kullanıyor, Bu anahtarlarda RS256, RS384 gibi algoritmalarla şifrelenir, bazı metotlarla da bu anahtar configüre edilebilir. AddSigningCredential, AddDeveloperSigningCredential, AddValidationKey gibi düzenlemeler var biz localhost için olan AddDeveloperSigningCredential’i kullanacağız.

migration:

update-database

migration işlemlerinden sonra tablolarımızın oluştuğumu göreceğiz, bu tablolarla ilgili detayları aşağıda belirtmiş olacağım. Bu oluşturduğumuz tabloları dolduracak bir seed data yazalım. Bu datalar üzerinden identityserver’ın objelerini yakından inceleyelim.

Identity Resources

Username,mail,id gibi unique user/identity datalardır. buraya ekstra datalar eklenebilir (role gibi)

Client

IdentityServer’dan token talep eden uygulamalardır. Bu uygulamalar web, mobile, spa, server gibi yazılım teknolojileridir.

Bir statik class üzerinde örnek bir client tanımlayalım.

Örnek bir tane client ekledik, AllowedGrantTypes özelliği client’ın nasıl kullanılacağını belirleyen önemli bir parametre, bu özellik eğer code olarak set edilirse client’a bir kullanıcı aracılığıyla bir giriş yapılacağını belirtmiş oluruz. Verilen Url’ler uygulamanın kendi url’leri olacak şekildedir.

Bu statik verilerimizi middleware tarafında identity server’ın memory’sine tanımlayalım.

Login Controller/View

Merkezi login controllerı ve view’ını identityserver projesine ekleyelim.

AccountController

UserService işlevi user,password vs gibi kontroller sizde burada istediğiniz düzenlemeleri, validasyonları ekleyebilirsiniz. Login ekranına ise aşağıdaki github adresinden ulaşabilirsiniz.

Identity sitemiz’de login olduktan sonra bilgiler cookie’ye set edilir, bu çerezlerden diğer sitelerimizin erişebilmesi için bazı ayarları yapmamız gerekiyor.

IdentityProfileService

Burada kritik bir noktaya geldik, kullanıcımız login olduktan sonra account/login post olacak orada bir cookie ataması yapıyoruz. ama tabiki bu kadar atama yeterli değil kullanıcının ismi, maili, doğum tarihi vs. gibi bilgileri istenilen clienta vermeliyiz. Bunun için identityserver’ın sağladığı IProfileService den miras alınarak bir service yazalım.

Giriş yapmak isteyen client’ın talep ettiği ve yetkisi olan claimler burada eklenecek. Dependecy injection için AddProfileService()<IdentityProfileService>() eklemeyi unutmayın

Mvc uygulması

Şimdi bir tane .net core mvc projesi ekleyelim ve login olarak identity server’ı ekleyelim.

MapJsonKey gelen claimleri çözümlemesi gerekli bir fonksiyon sadece role ve gender için var o yüzden phone gibi alanlar yetkisi olunsa bile cookie’ye eklenmez.
OnTokenValidated ise artık giriş işlemleri başarılı olduktan sonra yakalanan event. Burada kendi client’ınıza özel cliamleri ekleyebilirsiniz.
Authority: SSO adresi

Middleware yukarıdaki ayarları eklemeyi unutmayın.

Identity server içinde MvcApp için url bilgilerinde mutlaka ayağa kalkan mvc uygulamanızın giriş bilgilerini giriniz.

Şimdi hem mvc uygulaması içinde bir endpoinete [Authorize] attribute ekleyelim.

Privacy tıkladığımız an bizi login page’e atması gerekecek.

Logout

Öncelikle account controller’a bir logout endpointi eklemeliyiz.

IdentityServer -> AccountController -> Logout

MvcApp -> Logout

Statik identity config üzerinde PostLogoutRedirecturis alanını doğru yazmayı unutmayınız

Sonuç

Merkezi bir sso ve bunu tüketecek bir tane de mvc uygulaması yaptık. Sql ayarlarını yapsak da verileri memory üzerinden işledik. Uygulama’da kritik nokta cookiler’i paylaşma, bu paylaşma’da Client’ın yetkili olduğu cliamlere göre yapıyoruz bunu da ProfileService içinde yaptık.
İşler karışık gibi gözükse de olay giriş yapma, yönlendirme ve cookie’leri paylaşmadan ibaret.

Proje Linki: https://github.com/okankrdg/SingleSignOn

You may also like...

Bir cevap yazın

E-posta hesabınız yayımlanmayacak.

Turkish