IdentityServer Implementation

.NET IdentityServer Implementation

ASP.NET Core tabanlı IdentityServer, OAuth 2.0 ve OpenID Connect (OIDC) protokollerini uygulayan yetkilendirme sunucusudur. API, Web, Mobil, SPA gibi farklı platform ve uygulamalara yönelik ortak bir yetkilendirme yöntemi sunmaktadır. IdentityServer kütüphanesi open-source ve ihtiyaçlar doğrultusunda özelleştirmelere açıktır. Literatürde OpenID Connect Provider, Authorization Server, Identity Provider ve STS (Security Token Service) isimlerinde geçmektedir.

Günümüz modern uygulamalarında bir Client (web, mobil) çoğu zaman birden fazla API ile haberleşmektedir. API uygulamaları çeşitli API kaynaklarını da arkaplanda tüketebilmektedir. Birbirinden bağımsız, dağıtık bu uygulamala ve kaynakların dış dünyaya kapatılarak güven altına alınması gerekmektedir. Yetkilendirme işlemlerinin uygulama bazında implemente edilmesi kod tekrarı, zaman kaybı ve yönetim zorluklarına neden olmaktadır. Bu sorunların üstesinden gelmek için authentication ve authorization işlemlerinin merkezileştirilmesi gerekmektedir.

Benzer şekilde bir firmanın aynı kullanıcı kitlesine sahip dış dünyaya açılan farklı uygulamaları olabilmektedir. Yetkilendirme yapısının merkezileştirilmediği senaryoda kullanıcıların bu uygulamalara tek tek giriş ve çıkış yapmaları gerekecektir. IdentityServer uygulamalar arasında kullacılara single sign-in ve single sign-out özelliği de sunmaktadır.

Yazı boyunca ele alınan başlıklar aşağıdaki şekildedir.

IdentityServer OAuth 2.0 ve OpenID Connect protokollerini uyguladığından bu protokoller hakkında bilgi sahibi olunması gerekmektedir. Aksi taktirde aşağıdaki akışlar anlaşılmayacaktır.

OAuth 2.0 protokolünde iletişim halindeki tarafları tanımlayan bir takım roller mevcuttur.

  • Resource owner korunan veri ve hizmete erişim izni veren varlıktır.
  • Resource server korunan veri ve hizmetleri barındıran sunucudur.
  • Client resource owner adına korunan veri ve hizmetlere istekte bulunan uygulamadır.
  • Authorization server resource owner kimliğini doğrulayıp client uygulamalarını yetkilendirerek access token dağıtır.

IdentityServer kütüphanesi implemente edilirken bu tarafların authorization server rolünü üstlenen projeye tanıtılması gerekmektedir.

Client Credentials Flow

API kaynaklarının dış dünyaya kapatılarak yalnızca belirli client uygulamalarıyla iletişim kurması istendiği durumlarda kullanılması gereken akıştır.

IdentityServer Client Credentials Grant

Yetkilendirmeye tabi olmayan client uygulamaları koruma altına alınan API kaynaklarını tüketmek istemektedir. Client uygulaması öncelikle kendisini authorization server‘a client olarak kaydetmesi gerekmektedir. Authorization server kayıt işlemiyle client uygulamasına client credential (client id, client secret) bilgilerini verir. Sonrasındaysa client client id ve client secret bilgileriyle authorization server‘a giderek bir access token elde eder. (1) Client uygulaması elde ettiği access token ile resource server kaynaklarını tüketir. (2)

Authorization Server

Öncelikle authorization server rolünü üstlenen projeyi oluşturup gerekli IdentityServer4 NuGet paketini kuralım.

Bu akışta kullanacağımız OAuth 2.0 protokolünde rollerimizi temsil edecek kaynaklarımızı tanımlayalım.

API kaynaklarını ApiResource client uygulamalarını Client ve uygulama içerisinde kullanılacak kapsamlar ApiScope ile tanımlanmaktadır. Scope olarak Client modeline doğrudan ApiResource Name değeri verilebilir. Client modelinde ClientId ve ClientSecret bilgileri tanımlanmıştır.

Gerekli servis ve middleware konfigürasyonlarını yapalım.

IdentityServer konfigürasyonları yapılarak kaynaklar in-memory olarak eklenmiştir. Development ortamında kullanılacak bir sertifika olmadığı durumda AddDeveloperSigningCredential methodu kullanılmalıdır. Uygulama ilk ayağa kalktığında tempkey.jwk isminde geçici bir imzalanmış anahtar oluşturulmaktadır. Production ortamında AddSigningCredential methodu kullanılmalıdır.

Client uygulaması credential bilgileriyle bir endpoint üzerinden access token almaktadır. IdentityServer kullanıma hazır bir grup endpoint tanımlar.

  • Discovery endpoint IdentityServer hakkında metadata bilgisine ulaşmak için kullanılmaktadır. Issuer, diğer endpoint adresleri, desteklenen kapsamlar gibi bilgileri barındırır. /.well-known/openid-configuration adresinden ulaşılır.
  • Authorize endpoint User-Agent üzerinden token ve authorization code almak için kullanılır. /connect/authorize adresine sahiptir.
  • Token endpoint token elde etmek için kullanılır. /connect/token adresine sahiptir.
  • UserInfo endpoint yetkilendirilen kullanıcı hakkındaki bilgileri elde etmek için kullanılmaktadır. /connect/userinfo adresine sahiptir.
  • Device authorization endpoint device flow authorization işlemlerini başlatmak için kullanılır. /connect/deviceauthorization adresine sahiptir.
  • Introspection endpoint token doğrulamak için kullanılır. /connect/introspect adresine sahiptir.
  • Revocation endpoint access token ve refresh token bilgilerini iptal ederek geçersiz kılar. /connect/revocation adresine sahiptir.
  • End session endpoint single sign-out işlemini tetiklemek için kullanılır. /connect/endsession adresine sahiptir.

Resource Server

Resource server olarak bir API projesi oluşturalım. Bir token geldiğinde doğrulanabilmesi ve JWT Authentication işlemleri için Microsoft.AspNetCore.Authentication.JwtBearer NuGet paketini kuralım.

Yetkilendirme servislerini DI olarak ekleyip middleware ayarlarını yapalım.

Kimlik doğrulamayla ilgili servisler AddAuthentication methodu ve Bearer varsayılan scheme kullanılarak ekleniyor. Yetkilendirmeyle ilgili servisler AddAuthorization methoduyla eklenerek kapsamlar doğrultusunda Claim-Based Authorization gerçekleştirmek üzere AddPolicy methoduyla eklenmektedir.

Controller sınıfımızı oluşturup dummy data kullanarak CRUD işlemleri gerçekleştirelim.

Görüldüğü üzere action methodlar Authorize attribute ile işaretlenerek oluşturulan Policy‘ler içerisinde tanımlanmıştır.

Client Application

Client uygulamasını temsil edecek MVC projesini oluşturalım ve IdentityModel NuGet paketini kuralım. IdentityModel paketi OpenID Connect ve OAuth 2.0 protokolü için HttpClient sınıfını genişleten bir dizi extension method tanımlar. Authorization Server üzerinden token alınırken ve Resource Server kaynakları tüketilirken bu methodlardan faydalanılacaktır.

Controller sınıfımızı valid bir token edinip bu token ile resource server kaynaklarını listeleyecek şekilde kodlayalım.

IdentityServer metadata bilgisi GetDiscoveryDocumentAsync methoduyla elde ediliyor. Sonrasındaysa bu metadata bilgisi içerisindeki TokenEndpoint adresi ve client credential bilgileri kullanılarak RequestClientCredentialsTokenAsync methoduyla token elde ediliyor. İşlem başarılıysa resource server‘a istek atılmadan önce Authorization header SetBearerToken methoduyla ayarlanıyor.

Client uygulaması resource server kaynaklarını kapsamları (scope) doğrultusunda tüketmeye hazır.

Hybrid Flow

Bu akış Implicit ve Authorization Code akışlarının birleşimidir. Akışlar, Response Type parametresinde belirtilen değere göre şekillenir.

FlowResponse Type
Authorization Codecode
Implicitid_token
Implicitid_token token
Hybridcode id_token
Hybridcode token
Hybridcode id_token token

Implicit akışta tüm token bilgileri front-channel üzerinden gönderilmektedir. Identity token için bu sorun olmasada gerekli olmadığı durumlarda access token dış dünyaya açılmamalıdır. Client uygulaması öncelikle front-channel üzerinden aldığı identity token ile doğrulama işlemi gerçekleştirir. Sonrasındaysa client uygulaması back-channel üzerinden access token elde eder.

IdentityServer Hybrid Flow

Client uygulaması resource owner adına resource server bünyesindeki bilgilere erişmek istemektedir. Client uygulaması resource owner‘ı gerekli bilgileri query string parametrelerine ekleyerek authorization server‘a yönlendirir. (1) Yönlendirme esnasında scope içerisinde openid belirtilerek bunun OpenID Authentication işlemi ve Identity token için bir istek olduğu belirtilir. Resource owner kimliğini doğruladığında client uygulamasını yetkilendireceği consent sayfasına yönlendirilir. (2) Client uygulaması yetkilendirildiğinde bir authorization code ve identity token üretilerek Redirect Uri‘ye gönderilir. (3) Client uygulaması authorization code karşılığında bir access token ve identity token elde eder. (4) Sonrasındaysa client uygulaması elde ettiği access token ile resource server kaynaklarıyla haberleşmektedir. (5)

Authorization Server

Client Credentials akışında kullanılan Authorization Server projesini geliştirmeye devam edelim. Bu akışta kullanılan kaynakları ekleyelim.

Yeni kaynakların eklendiği görülmektedir. TestUser ile development ortamında kullanılacak test amaçlı bir kullanıcı ve sahip olduğu claim bilgileri atanmaktadır. IdentityResource kullanıcı hakkındaki id, name ve email gibi bilgilerden oluşur ve authorization server tarafından desteklenen identity resource bilgilerini temsil eder. Client uygulaması bu identity kaynaklarına erişmek için ilgili kaynakları scope parametresinde belirtir. OpenID Connect spesifikasyonu bir takım standart identity resource tanımlar. Bunlardan bir tanesi zorunlu olan openid kapsamı IdentityResources.OpenId() kullanılarak eklenmiştir. Identity token içerisinde bulunacak subject id (sub) claim bilgisidir. IdentityResources.Profile() ile kullanıcı hakkındaki (name, gender gibi) bilgilerin desteklenen identity resource listesine eklendiği görülmektedir. İhtiyaçlar doğrultusunda bir takım özel IdentityResource claim bilgileriyle örneklenerek eklenmiştir.

Hybrid akışını kullanacak Client kaynağı AllowedGrantTypes property’sine GrantTypes tiplerinden Hybrid atanarak eklenmiştir. AllowedScopes property’siyle client uygulamasının resource owner adına erişebileceği bilgiler tanımlanır. RedirectUris ve PostLogoutRedirectUris property’lerinde belirtilen uri’ler client uygulamasına kurulacak NuGet paketinde ön tanımlıdır. RequireConsent ile consent ekranının resource owner‘a gösterilip gösterilmeyeceği ayarlanmaktadır.

Oluşturulan IdentityResource ve TestUser kaynaklarını in-memory olarak ekleyelim.

Gerekli ön hazırlık yapıldığına göre kullanıcıların giriş, çıkış gibi işlemleri gerçekleştireceği işlevselliğin kazandırılması gerekmektedir. IdentityServer kullanıcı login, logout, consent gibi işlemlerin gerçekleştirildiği bir QuickStart arayüzüne sahiptir. Repository içerisinde belirtildiği şekilde Authorization Server ana dizininde ilgili komutu çalıştıralım. Gerekli dosyalar indirildiğinde proje içerisine QuickStart isminde bir klasör ve Views klasöründe ilgili view‘ların eklendiği görülmelidir. Authorization Server ayağa kaldırılarak TestUser kaynağındaki kullanıcı credential bilgileriyle giriş yapılarak arayüz incelenebilir.

Client Application

Client uygulamasını temsilen bir MVC projesi oluşturup gerekli IdentityModel ve OpenID Connect kimlik yetkilendirme işlemlerini gerçekleştirmek için Microsoft.AspNetCore.Authentication.OpenIdConnect NuGet paketlerini kuralım.

Sonrasındaysa Cookie ve OpenID Connect Authentication konfigürasyonlarını yapalım.

Client uygulaması bir MVC projesi olduğundan Cookie-Based Authentication yapılmaktadır. OpenID Connect Handler AddOpenIdConnect methoduyla eklenmiştir. ResponseType property’sine code id_token verilerek Hybrid akış kullanılacağı belirtilmiştir. Cookie üzerinde sadece gerekli claim bilgileri tutulmakta ve ilave claim bilgileri için UserInfo endpoint’inin kullanılması gerekmektedir. GetClaimsFromUserInfoEndpoint property’siyle ilave claim bilgilerinin bu endpoint üzerinden otomatik olarak çekileceği ayarlanmaktadır. Gerekli scope bilgileri eklenerek oluşturduğumuz IdentityResource içerisindeki claim bilgileri map’lenmektedir. Identity, access ve refresh token bilgileri cookie‘nin properties bölümünde SaveTokens özelliğiyle saklanmaktadır.

Token bilgilerinin cookie üzerinde saklanmasıyla bu bilgilere yukarıdaki gibi ulaşabiliriz. Bu akışta client uygulamasının yetkilendirilmesiyle elimizde bu token bilgilerinin tamamı olacaktır. Access token kullanarak resource server kaynaklarını tüketelim.

Cookie bilgisi üzerinden access token elde edilerek Authotization Header bilgisine Bearer olarak atanmaktadır. Sonrasındaysa API endpoint’leriyle haberleşilmektedir.

Programatik olarak refresh token kullanarak yeni bir access token elde edecek methodumuzu yazalım.

Authorization Server metadata bilgisi GetDiscoveryDocumentAsync methoduyla elde edilerek cookie üzerinden refresh token bilgisi okunmaktadır. Bu bilgiler doğrultusunda RequestRefreshTokenAsync methoduyla yeni access token elde edilmektedir. Yeni token bilgileriyle yetkilendirilen kullanıcının cookie üzerindeki token bilgileri güncellenmektedir.

Kullanıcı giriş, çıkış işlemleri gibi işlevsellikler authorization server‘a eklenen QuickStart arayüzleri üzerinden sağlanmaktadır. Yetkilendirme gereken bir sayfaya erişilmeye çalışıldığında kullanıcı otomatik olarak Authorization Server kimlik doğrulama sayfasına yönlendirilmektedir. Çıkış işlemleri için bizim yönlendirme yapmamız gerekmektedir.

İlk satırda client uygulamasından çıkış işlemi yapılmaktadır. İkinci satırda kullanıcı authorization server‘a yönlendirilerek çıkış işlemi buradan gerçekleştirilmektedir. Bu işlemle kullanıcıya çıkış işleminin başarılı olduğunu söyleyen bir sayfa gösterilmektedir. Bu davranış AccountOptions sınıfındaki AutomaticRedirectAfterSignOut field’ı üzerinden değiştirilmektedir.

Client Application Role-Based Authorization

Bu akışı bitirmeden controller sınıfımızın action methodlarını koruma altına alalım. Authorization server tarafından desteklenen IdentityResource kaynakları tanımlanırken Roles isimli özel bir IdentityResource tanımlanmıştı. Sonrasındaysa client kaynağının scope bilgisine bu identity kaynağı verilerek resource owner adına bu bilgiye erişeceği belirtilmişti. TestUser kullanıcıları oluşturulurken Claim bilgisine sahip olduğu rol bilgisi atanmıştı.

Client uygulamasında AddOpenIdConnect methoduyla rol için hangi isimlendirmenin kullanılacağı TokenValidationParameters ile belirtilmişti. Bu konfigürasyonlardan sonra yapılması gereken tek şey action methodlarının Authorize attribute’üyle işaretlenmesidir.

Bu sayfalara gerekli rollere sahip olmayan kullanıcılar erişim sağlayamayacaktır.

Implicit Flow

Bu akış son zamanlara kadar JavaScript tabanlı client uygulamaları için önerilen akıştı. Uygulama kaynak kodları erişime açık olduğundan ClientSecret bilgisini bünyesinde tutamaz. Bu akışta authorization code değiş tokuşu olmaksızın client uygulamasına tek işlemde access token dönülmektedir.

IdentityServer Implicit Flow

Son zamanlarda yeni standartlarla bu durum değişmiştir. JavaScript tabanlı client uygulamaları için Authorization Code Flow with PKCE (Proof Key for Code Exchange) akışının kullanılması tavsiye edilmektedir.

Authorization Code Flow with PKCE

Authorization Code akışında Hybrid akışa göre Response Type değerinin code olması gibi ufak farklılıklar bulunmaktadır. Bu akış client uygulamasının kullanıcıyı authorization server‘a yönlendirmesiyle başlar. Client uygulamasının yetkilendirilmesiyle IdP, front-channel üzerinden geriye bir authorization code döner. Client uygulaması Token endpoint’ini kullanarak code karşılığında back-channel üzerinden access token elde eder. Sonrasındaysa resource server kaynaklarıyla access token kullanarak iletişime geçer.

PKCE kullanıldığı takdirde akış biraz daha değişmektedir.

IdentityServer Authorization Code Flow with PKCE

Client uygulaması resource owner‘ı authorization server‘a şifrelenmiş code_challenge ile yönlendirir. (1) IdP bünyesinde bunu depolamaktadır. Resource owner kimliğini doğrulandığında client uygulamasını yetkilendirmek üzere consent ekranına yönlendirilmektedir. (2) Client uygulaması yetkilendirildiğinde geriye authorization code dönülür. (3) Client sonrasındaysa code ve code_verifier bilgisini Token endpoint’ine back-channel üzerinden iletir. (4) IdP code_verifier bilgisini şifreleyerek code_challenge ile karşılaştırıp geriye id token ve access token döner.

Authorization Server

IdentityServer projesini geliştirmeye devam edelim. Bu akışta ilave bir client eklememiz yeterlidir.

Client kaynağına AllowedGrantTypes özelliğine GrantTypes tiplerinde Code atanarak oluşturulmuştur. PKCE‘nin gerekli olduğu RequirePkce ile front-channel üzerinden access token dönüleceği AllowAccessTokensViaBrowser ile belirtilmiştir. CORS origin ayarlamaları, giriş ve çıkış işlemlerinde kullanılan Redirect URI adresleri tanımlanmıştır.

Client Application

Bu akışta client uygulaması için Angular projesi oluşturulacaktır. Projeyi oluşturup gerekli oidc-client npm paketini kuralım ve tüm işlemleri gerçekleştireceğimiz bir component oluşturalım.

Öncelikle environment dosyalarında kullanılan gerekli bilgileri tanımlayalım.

Sonrasındaysa giriş, çıkış gibi işlemleri gerçekleştirecek servisimizi yazalım.

Client uygulamasının yetkilendirilmesiyle belirtilen Redirect URI adresine callback olduğunda gerçekleşecek işlemleri yazalım.

Sonrasındaysa kullanıcıların giriş, çıkış yapacağı ve resource server kaynaklarıyla konuşacağı kod bloğunu HomeComponent içerisinde tanımlayalım.

Projeler ayağa kaldırıldığında kullanıcının login butonuna tıklamasıyla authorization server’a yönlendirildiği görülecektir. Giriş işleminin başarılı olmasıyla kullanıcı yetkilendirilerek Angular uygulamasına geri dönülmektedir. Client uygulaması artık API kaynağına access token ile giderek izni doğrultusunda istediği bilgilere erişmektedir.

Resource Owner Password Flow

Bu akış client uygulaması ve authorization server arasında güven ilişkisi olduğu durumlarda tercih edilmelidir. Öncelikle resource owner, credential bilgilerini authorization server yerine client uygulamasına girmektedir. Client uygulaması elde ettiği credential bilgileriyle back-channel üzerinden authorization server‘a giderek access token elde eder. Taraflar arasında güven ilişkisi olmadığı durumlarda client uygulamasının credential bilgilerini nasıl işlediği bilinemeyecektir.

Authorization Server

IdentityServer projesine yeni bir client ekleyerek geliştirmeye devam edelim.

Client uygulamasının akış tipi GrantTypes tiplerinden ResourceOwnerPassword olarak belirtilmiştir. Bu akışın kullanılabilmesi için IResourceOwnerPasswordValidator arayüzünün implemente edilmesi gerekmektedir.

Görüldüğü üzere ResourceOwnerPasswordValidationContext nesnesi üzerinden TestUser kaynağındaki kullanıcı credential bilgileri karşılaştırılmaktadır. Şartların karşılanmasıyla sonuç GrantValidationResult olarak belirlenmektedir.

Oluşturduğumuz validator sınıfının IdentityServer‘a eklenmesi gerekmektedir.

Client Application

Client projesi için bir MVC projesi oluşturarak gereken IdentityModel NuGet paketini kuralım.

Program.cs içerisinde Cookie Authentication konfigürasyonlarını gerçekleştirelim.

Client uygulaması içerisinden kullanıcın giriş ve çıkış işlemlerini gerçekleştireceği controller sınıfını dolduralım.

IdentityServer metadata bilgileri çekilerek RequestPasswordTokenAsync methoduyla kullanıcı giriş yaptırılmaya çalışılmaktadır. Giriş işleminin başarılı olmasıyla GetUserInfoAsync methoduyla kullanıcı bilgileri UserInfo endpoint’inden çekilmektedir. Bu bilgilerle ClaimsPrincipal sınıfı örneklenerek kullanıcı client uygulamasında giriş yaptırılmaktadır.

IdentityServer Custom UserStore

IdentityServer projemizi test kullanıcılarından ayırarak gerçek hayat senaryolarına biraz daha yakınlaştıralım. Öncelikle Microsoft.EntityFrameworkCore.SqlServer NuGet paketini kuralım ve kullanıcı sınıfımızı oluşturalım.

DbContext sınıfımızı oluşturalım.

DbContext sınıfımızı servis olarak ekleyelim.

AppUser sınıfı üzerinde bir takım işlemleri gerçekleştiren Repository sınıfımızı yazalım. IRepository arayüzü yazıyı uzatmamak için paylaşılmamıştır. Sonrasındaysa bu sınıfı AddScoped methoduyla DI Container‘a ekleyelim.

Resource Owner Password akışında IResourceOwnerPasswordValidator arayüzü implemente edilmişti. Bu sınıfı oluşturulan Repository sınıfına göre düzenleyelim.

Görüldüğü üzere kullanıcı credential bilgileri kontrol edilerek sonuç Result özelliği üzerinden atanmaktadır.

TestUser kaynağında test kullanıcılarının claim bilgileri oluşturulurken atanmıştı. Bu claim bilgilerine değinildiği üzere token ve UserInfo endpoint’i üzerinden erişilmektedir. Custom UserStore implementasyonuyla kullanıcılar dinamik şekilde elde edileceğinden claim atamaları da dinamik olmalıdır. Başarılı giriş işlemlerinde kullanıcılara claim atamak için IProfileService arayüzü implemente edilmelidir.

Arayüz iki methodla birlikte gelmektedir. Kullanıcının token almasına izin verilip verilmeyeceği IsActiveAsync methoduyla belirtilir. Claim bilgileri kullanıcıya GetProfileDataAsync methoduyla atanmaktadır. Kullanıcı id bilgisi GetSubjectId methoduyla elde edilerek Repository üzerinden kullanıcı elde edilmektedir. Sonrasındaysa claim bilgileri oluşturularak AddRequestedClaims methoduyla kullanıcıya atanmaktadır.

ProfileService sınıfını IdentityServer‘a ekleyelim.

QuickStart ile eklenen UI içerisinde son bir değişikliğin daha yapılması gerekmektedir. Artık test kullanıcılarıyla çalışmayacağımız için AccountController içerisinden TestUserStore sınıfı IUserRepository arayüzüyle değiştirilmelidir.

Http POST Verb‘ine ait Login action methodunda aşağıdaki kod bloğunun,

Şeklinde değiştirilmesi gerekmektedir.

IdentityServer ASP.NET Identity

IdentityServer projesine ASP.NET Identity desteği kazandırmanın iki yolu vardır. Geliştirmeye sıfırdan başlanıyorsa hazır bir template üzerinden aşağıdaki gibi proje oluşturulabilir.

Mevcut bir IdentityServer projesine ASP.NET Identity desteğini EF Core implementasyonu Microsoft.AspNetCore.Identity.EntityFrameworkCore NuGet paketini kurarak başlayalım. Sonrasındaysa kullanıcı sınıfımızı oluşturalım.

DbContext sınıfımızı IdentityDbContext<TUser> sınıfından inherit alarak oluşturalım.

Oluşturduğumuz DbContext sınıfını, Identity API ve IdentityServer’i ekleyelim.

ASP.NET Identity implementasyonu bu kadar basittir. IdentityServer AddAspNetIdentity methoduyla IUserClaimsPrincipalFactory IResourceOwnerPasswordValidator ve IProfileService arayüzlerini ASP.NET Identity implementasyonuna göre yapılandırır. Bu arayüzler Custom UserStore başlığında olduğu gibi implemente edilmektedir.

IdentityServer Entity Framework Core

IdentityServer kaynakları şimdiye değin in-memory olarak kullanıldı. Bu kaynaklar değiştirildiğinde projenin tekrar ayağa kaldırılması gerekmektedir. Bu durumda dağıtılan refresh token, üretilen authorization code bilgileri geçersiz olacaktır. Bu kaynakların veritabanına taşınmasıyla persistentcy sağlanabilir. Bu işlem için IdentityServer4.EntityFramework NuGet paketinin kurulması gerekmektedir. Bu paket aşağıdaki DbContext sınıflarını uygular.

  • ConfigurationDbContext Client, ApiResource, ApiScope gibi kaynaklar için kullanılmaktadır.
  • PersistedGrantDbContext Refresh Token, Authorization Code gibi geçici veriler için kullanılmaktadır.

Bu veriler SQL Server üzerinde depolanacağından Microsoft.EntityFrameworkCore.SqlServer NuGet paketinin kurulması gerekmektedir.

Görüldüğü üzere verileri taşımak bu kadar kolay. ConfigurationDbContext sınıfı AddConfigurationStore methoduyla ve PersistedGrantDbContext sınıfı AddOperationalStore methoduyla eklenmektedir.

You may also like...

Bir cevap yazın

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