Yazılım Mimarileri ve Tasarım Desenleri Üzerine

IdentityServer4 Yazı Serisi #12 – Merkezi Üyelik Sistemi – Claim ve Authentication Propertyleri Okuma

Merhaba,

IdentityServer4 Yazı Serisinin bir önceki kaleme aldığımız Merkezi Üyelik Sistemi Temelleri başlıklı makalemizde client’ın Auth Server’dan authorization code almasını başarmış ve client üzerinde authorize olan kısımlara yetkili bir şekilde erişimi test etmiştik. Bu içeriğimizde ise Auth Server’dan elde edilen authorization code üzerinde bulunan ve client’a gönderilen claim’lerin ve ‘Authentication Propertyleri’nin nasıl okunduğunu/elde edildiğini inceleyeceğiz.

Öncelikle Claim ve Authentication Property terimlerinin ne olduğunu açıklayarak başlayalım;

Claim’lere Erişim?

Authorization code içerisindeki claim’lere erişebilmek için controller sınıflarda User.Claims komutunun kullanılması yeterlidir. Gelen claim’lere göz atarsak eğer;

Evet… Gelen claim’ler işte bu kadar. Şimdi muhtemelen bir önceki makalemizde oluşturulan test user’lar da tanımladığımız ve ‘IdentityResource’ içerisinde new IdentityResources.Profile() komutu ile authorization code’a eklenmesini söylediğimiz claim’lerin neden gelmediğini soruyor olabilirsiniz.

Test User IdentityResource
İlgili claim’lerin eklendiği noktalardaki görseller…

Bu claim’lerin User.Claims‘e eklenmemesinin sebebi ilgili cookie yahut token değerinin şişirilmemesidir. İşlevsel olarak IdentityServer4 kütüphanesi UserInfo Endpoint’i üzerinden kullanıcıya dair tüm claim’lerin erişilebilir olmasını sağlamaktadır. Dolayısıyla ihtiyaç yahut istek neticesinde ilgili değerlerin elde edilebilmesi için bahsedilen endpoint’in kullanılması inisiyatife bağlı olacağından dolayı framework geliştiricileri, default olarak harici claim’lerin cookie yahut token’a eklenmesini performans açısından uygun görmemiştir.

Tabi ki de bu durum, istenildiği taktirde kullanıcıya dair tüm claim’lerin üretilecek cookie ya da token değerine eklenmesini engelleyen bir durum demek değildir. Eğer ki tüm claim’lerin otomatik olarak cookie ya da token değerine eklenmesini istiyorsanız ilgili client’ın ‘Startup.cs’ dosyasında aşağıdaki gibi ‘GetClaimsFromUserInfoEndpoint’ konfigürasyonunun yapılması yeterli olacaktır.

    public class Startup
    {
        public void ConfigureServices(IServiceCollection services)
        {
            services.AddAuthentication(_ =>
            {
                _.DefaultScheme = "OnlineBankamatikCookie";
                _.DefaultChallengeScheme = "oidc";
            })
            .AddCookie("OnlineBankamatikCookie")
            .AddOpenIdConnect("oidc", _ =>
            {
                _.SignInScheme = "OnlineBankamatikCookie";
                _.Authority = "https://localhost:1000";
                _.ClientId = "OnlineBankamatik";
                _.ClientSecret = "onlinebankamatik";
                _.ResponseType = "code id_token";
                _.GetClaimsFromUserInfoEndpoint = true;
            });
            services.AddControllersWithViews();
        }
    }

‘GetClaimsFromUserInfoEndpoint’ propertysine ‘true’ değerini set ederek, oluşturulacak cookie yahut token değerlerine sistemde tanımlanmış olan tüm claim’leri eklemiş bulunmaktayız. Burada mimari, arkaplanda Userinfo Endpoint’ine tüm claim’ler için istek göndererek çalışmayı sergileyecektir.

GetClaimsFromUserInfoEndpoint; claim’lerden, profil için default olarak tanımlanmış olan değerleri getirecektir. name, family_name, given_name, middle_name, nickname, preferred_username, profile, picture, website, gender, birthdate, zoneinfo, locale, updated_at

Bu ayar lüzumlu lüzumsuz her cookie yahut token üretiminde kullanıcıya dair tüm claim’leri ekleyecektir. Halbuki bizler bu claim’lere erişimi daha iradeli bir şekilde gerçekleştirmek ve ihtiyaca istinaden elde etmek istiyorsak Userinfo Endpoint’ini kullanmamız gerekmektedir.

Authentication Propertylere Erişim?

Authentication propertyler; ‘Access Token’, ‘ID Token’ ve ‘Refresh Token’ olmak üzere temelde üç tanedirler. Auth Server’dan gelen authentication property’lere controller sınıflarından erişebilmek için (await HttpContext.AuthenticateAsync()).Properties.Items kod konseptinin kullanılması yeterli olacaktır.

İstek neticesinde gelen authentication property’lere göz atarsak eğer;

görüldüğü üzere belli başlı değerler gelmiş bulunmakta lakin hiçbiri operasyonel açıdan bizim için bir anlam ifade etmemektedir. Hani hoca! Access token, refresh token ve id token nerede? diye sorduğunuzu duyar gibiyim 🙂 Evet, böylece authentication property’ler içerisinde ilgili değerlerin default olarak gelmediğini ve özellikle adı geçen parametrelere erişebilmek için ekstradan bildirilerde bulunmamız gerektiğini anlamış bulunmaktayız.

Şimdi sırasıyla bu propertylere nasıl erişilebildiğini inceleyelim;

Access Token ile Id Token Arasındaki Fark

Her iki JWT değerini jwt.io sitesi üzerinden incelersek eğer;

Access Token Id Token
Her iki değerin açılımına göz atarsanız eğer kendilerine has belli başlı bilgilerin yanında, access token, erişimi sağlayabilmesi için ‘scope’ altında yetkiler barındırmaktadır. Lakin id token’da ‘scope’ yer almamaktadır. Burada id token’ın yukarılarda bahsedildiği gibi sadece doğrulama amaçlı üretilen bir değer olduğu daha da netleşmiş olmaktadır.

Userinfo Endpoint

Kullanıcı hakkında claim bilgilerini elde etmek için kullanılan endpoint’tir.
/connect/userinfo endpoint’ine header bilgisi Authorization: Bearer olan bir ‘GET’ isteğinde bulunulması yeterlidir.

Görüldüğü üzere Userinfo Endpoint ile elde edilen claim’ler, sadece profil için default olarak tanımlanmış değerler değil, tam aksine kullanıcıya dair olan tüm değerlerdir.

İlgilenenlerin faydalanması dileğiyle…
Sonraki yazılarımda görüşmek üzere…
İyi çalışmalar…

Not : Örnek uygulamayı indirebilmek için buraya tıklayınız.

Mobil sürümden çık