Merhaba,
Bu içeriğimizde kanaatim odur ki Asp.NET Core açısından .NET 8 ile gelen en güzel özelliklerden birini, Identity API Endpoints özelliğini inceleyeceğiz. Bu özellik sayesinde uygulamalarımızdaki temel kullanıcı işlemlerini gerçekleştirdiğimiz Identity mekanizmasının artık daha pratik ve etkin bir şekilde kullanılabildiğini ve özellikle API dostu bir alternatif yöntemin olabileceğini gözlemliyor olacağız. O halde buyurun başlayalım…
Asp.NET Core Identity Nedir?
Asp.NET Core Identity, geliştirdiğimiz uygulamalarda kullanıcı yetkilendirme, kimlik doğrulama ve rol yönetimi sağlayan bir framework’tür. Bu framework sayesinde kullanıcı kaydetme, giriş yapma, rol atama, şifre sıfırlama ve Google, Facebook gibi external identity provider’larla entegrayon vs. gibi temel kimlik yönetimi işlemlerini kolaylıkla gerçekleştirebilmekteyiz.
Identity mekanizmasının çekirdeği Data model, Stores ve Managers olmak üzere üç ana soyutlamaya dayanmaktadır.
- Data model
Identity mekanizmasında temel türlerini tarif eden modellerdir. Bu modeller,IdentityUserveIdentityRoleinterface’leri üzerinden implementasyonlarla sağlanır. - Stores
Veri modellerini fiziksel olarak depolamak ve sorgulamak için kullanılan katmandır.IUserStoreveIRoleStoregibi interface’ler içermektedir. - Managers
Kullanıcı yönetimi için Stores üstünde bir service katmanı sağlayan sınıflardır. Bu servisler;UserManager,RoleManagerveSignInManager‘dır.
Bu güne kadar Asp.NET Core mimarisinde mevcut olan Identity mekanizmasına dair tam teferruatlı bilgi edinmek için Asp.NET Core Identity – Yazı Dizisini takip etmenizi öneririm.
Neden Identity API Endpoint’e İhtiyacımız Var?
Identity mekanizmasının data modelleri üzerinden kullanıcı ile ilgili gerekli modellemeyi hızlıca gerçekleştirebiliyor ve yönetici(managers) sınıfları sayesinde de kullanıcı işlemlerini rahatlıkla yapabiliyoruz. Ancak bu kolaylığın yanında; kullanıcı ekleme, listeleme, oturum açma, şifre yenileme, iki aşamalı doğrulama vs. gibi işlemlerin gerçekleştirilebilmesi için de kullanıcı arayüzünün tasarlanması ve bu tasarımların kodlanması gerekmektedir. Her ne kadar bu tasarımların hızlı bir şekilde halledilebilmesi için Microsoft tarafından belli başlı UI kütüphaneleri oluşturulup, hizmetimize sunulmuş olsa da(Microsoft.AspNetCore.Identity.UI) bunların özelleştirilebilmesi için de ayrı bir maliyet durumu söz konusu olabilmektedir. Tüm bunların dışında uygulamanın frontend kısmı bir SPA teknolojisine sahipse işte bu taktirde bu kütüphanelerde bir anlam ifade etmemekte ve el mahkum tüm çalışmaları manuel bir şekilde gerçekleştirmek mecburiyetindeyiz. Hal böyleyken identity API endpoint sayesinde, API’ler için de identity mekanizmasının nimetlerini oldukça hızlı ve basit bir şekilde kullanılabilir hale getirebilmekteyiz.
Hele hele, SPA’ler de token authentication’ın kullanıldığı senaryolarda sıklıkla ihtiyaç duyulan access token değerini alabilmek bir endpoint’e istek göndermek gibi oldukça basit bir hale getirilmiş vaziyettedir. Evet, identity API endpoint özelliğini kullandığımız taktirde username ve password bilgileri eşliğinde aşağıdaki gibi bir isteğin yapılması görseldeki gibi bir JSON yanıtının hızlıca alınmasını sağlayacaktır.
$url = "https://localhost:7196/myapp/login"
$headers = @{
"Content-Type" = "application/json"
}
$body = @{
email = "gyildizmail@gmail.com"
password = "1q2w3e4r'S"
} | ConvertTo-Json
$response = Invoke-WebRequest -Uri $url -Method Post -Headers $headers -Body $body
# İstek sonucunu görüntüle
$response.content
Identity API’ların Kullanımı
Identity API Endpoint mekanizmasını kullanabilmek için öncelikle IdentityDbContext sınıfından türeyen DbContext sınıfının aşağıdaki gibi tasarlanması gerekmektedir.
public class AppDbContext : IdentityDbContext<AppUser>
{
public AppDbContext(DbContextOptions options) : base(options)
{
}
}
public class AppUser : IdentityUser
{
}
Ardından bu context sınıfının uygulamaya aşağıdaki gibi yapılandırılması gerekmektedir.
var builder = WebApplication.CreateBuilder(args);
.
.
.
builder.Services.AddDbContext<AppDbContext>(options => options.UseSqlServer("..."));
var app = builder.Build();
Ve son olarak da aşağıdaki talimatlar eşliğinde migration oluşturulup, hedef veritabanına migrate edilmelidir.
dotnet ef migrations add mig_1 dotnet ef database update
Evet, şimdi identity’i kullanabilmek için gerekli altyapı hazır diyebiliriz.
Bu aşamadan sonra AddIdentityApiEndpoints metodu eşliğinde identity servisleri uygulamaya ekleyebiliriz. Bunun için aşağıdaki gibi yapılandırma bulunalım;
builder.Services.AddIdentityApiEndpoints<AppUser>()
.AddEntityFrameworkStores<AppDbContext>();
Bu yapılandırma neticesinde; bearer ve cookie authentication yapılandırılmakta, temel kullanıcı işlemlerinden sorumlu olan UserManager ile birlikte SignInManager ve IEmailSender gibi servisler IoC container’a eklenmektedir.
Ve şimdide de tüm identity API’leri uygulamaya ekleyebilmek için MapIdentityApi middleware’ini aşağıdaki gibi çağıralım;
var app = builder.Build(); . . . app.MapIdentityApi<AppUser>(); app.Run();
Uygulamayı bu vaziyette derleyip ayağa kaldırırsak eğer özellikle swagger üzerinde aşağıdaki görselde olduğu gibi identity API endpoints özelliğinin getirisi olan tüm endpoint’leri görmekteyiz.MapGroup metoduyla çalışma yapmanız gerekmektedir;
app.MapGroup("/myapp").MapIdentityApi<AppUser>();
Unutmamak lazımdır ki; identity API endpoints de, IdentityServer veya OpenIddict kütüphanelerinin yerini almak amaçlanmamıştır! Bilakis sade ve sadece kullanıldığı uygulamanın kullanıcı yönetimi amaçlanmıştır. Ayrıca machine-to-machine iletişimden ziyade etkileşime girebilecek olan gerçek kullanıcılar tarafından kullanılmak üzere tasarlanmıştır. Yani anlayacağınız basit bir backend tarafından beslenen SPA senaryolarındaki kullanıcı ve rol işlemleri için identity API endpoint kolay bir seçimdir diyebiliriz.
Kullanıcı User & Password Kriterlerini Özelleştirme
Identity API Endpoints özelliği ile gelen hali hazırdaki user ve password kriterlerine AddIdentityApiEndpoints metodu üzerinden aşağıdaki gibi müdahalede bulunulabilmektedir.
builder.Services.AddIdentityApiEndpoints<AppUser>(options =>
{
options.User... //👈User'la ilgili özelleştirme
options.Password... //👈Password'le ilgili özelleştirme
})
Nihai olarak;
Identity API Endpoints özelliği sayesinde uygulamalarımızda identity mekanizmasını oldukça pratik ve etkili bir şekilde kullanabildiğimizi ve birçok backend işleminden de çalışmalarımızı arındırabildiğimizi tecrübe etmiş bulunuyor ve kod maliyeti ile birlikte zamansal açıdan da inanılmaz bir avantajın söz konusu olduğunu gözlemlemiş oluyoruz. İhtiyaç noktalarında kullanmayı heyecanla bekliyor olacağım 🙂
İlgilenenlerin faydalanması dileğiyle…
Sonraki yazılarımda görüşmek üzere…
İyi çalışmalar…
