Single Sign Out in .Net 6.0 and IdentityServer v4

In this post, we'll create a centralized login system using IdentityServer, a .NET library, to handle our authentication processes. Various clients will utilize this shared login for access.

What is SSO (Single Sign-On)

It enables centralized control and access with a single set of credentials for our identity and password information. Similar to companies like Google, Microsoft, or Facebook, where we don’t create new usernames or passwords for different applications, but rather access other applications with a single username and password

Project Architecture

We'll create two different project: one will run on .net 6 and identityserver, other will use as client.

Development Environment
  • Windows 11
  • Visual Studio 2022
  • .Net 6.0
Begin Project

I'm creating my project with the .NET 6.0 MVC option because the login page and other identity-related processes for Single Sign-On (SSO) will be within this project.

We'll need a database to store our users. To set this up, we'll first configure Entity Framework and the database settings.

Install The Following Packages

EntityFrameworkCore.SqlServer is used in the project to facilitate interaction and management of data with Microsoft SQL Server databases through Entity Framework Core,
EntityFrameworkCore.Tools : migration komutları için.

DbContext dependy injection /Program.cs

We are registering ApplicationDbContext inherited from DbContext and add Sql Server as database.

ApplicationContext.cs

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

User Entity: User.cs

Id is auto identity

Let's write connection string to appsettings.json.

Add Users to ApplicationContext

Migration Commands

more information for migrations see: link

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...

Leave a Reply

Your email address will not be published.

English