Derinlemesine yazılım eğitimleri için kanalımı takip edebilirsiniz...

.NET 8 – Identity API Endpoints

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, IdentityUser ve IdentityRole interface’leri üzerinden implementasyonlarla sağlanır.
  • Stores
    Veri modellerini fiziksel olarak depolamak ve sorgulamak için kullanılan katmandır. IUserStore ve IRoleStore gibi 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, RoleManager ve SignInManager‘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

.NET 8 - Identity API Endpoints

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..NET 8 - Identity API EndpointsDikkat ederseniz identity API endpoints özelliği ile kullanıcı kaydı(register) ve girişi(login) gibi temel düzey kullanıcı işlemlerinin dışında; refresh token, şifremi unuttum(forgotPassword) ve hatta çift faktörlü doğrulama(2FA) gibi tüm davranışlara karşılık gelen API’ler de hali hazırda eklenmiş vaziyettedir. Eğer ki bu API’lerin kapsamını farklı bir path ile başlatmak isterseniz aşağıdaki gibi MapGroup metoduyla çalışma yapmanız gerekmektedir;

app.MapGroup("/myapp").MapIdentityApi<AppUser>();

.NET 8 - Identity API Endpoints
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…

Bunlar da hoşunuza gidebilir...

6 Cevaplar

  1. Cemil dedi ki:

    öncelikle hocam hızlı içerikleriniz için tebrik ederim.
    buradaki örnekteki gibi WebApi oluşturup login endpoint üzerinden bir accessToken aldım.
    burada yer alan token’ı incelediğimde JWT.io üzerinden doğrulanmıyor. burada protector ile cookie’lerde olduğu gibi JWT’yi de şifreliyor sanırım.
    sorum başka bir WebApi projesinde bu token değerini nasıl validate edebilirim ve authentication yapabilirim?
    yani WebApi1 ile login olduktan sonra aldığım token ile WebApi2 üzerinde de validate token yaparak authenticated duruma gelmek istiyorum.
    teşekkürler.

  2. Kaan dedi ki:

    Paylaştığınız kıymetli ve teferruatlı bilgiler için teşekkür ederiz devamını bekleriz.

  3. ReDoX dedi ki:

    Bu api ile Role Management yapmak mümkün mü ?

    • Caner Ay Celep dedi ki:

      Evet yapabilirsin ->;

          services.AddIdentityApiEndpoints(options =>
          {
              options.SignIn.RequireConfirmedEmail = false;
              options.User.RequireUniqueEmail = true;
              options.Password.RequireDigit = false;
              options.Password.RequireUppercase = false;
              options.Lockout.AllowedForNewUsers = true;
              options.Lockout.DefaultLockoutTimeSpan = TimeSpan.FromMinutes(2);
              options.Lockout.MaxFailedAccessAttempts = 3;
          }).AddUserManager<UserManager>().AddRoles().AddRoleManager<RoleManager>().AddApiEndpoints().AddDefaultTokenProviders().AddEntityFrameworkStores();
      
  4. Serdeha dedi ki:

    Hocam merhaba,

    AppUser aracılığıyla kullanıcı bilgilerini özelleştirebilir miyiz ? örnek olarak resim eklemek istiyorum da. Araştırdım bir kaç yer özelleştirmeye izin vermiyor demişte.

  5. Anıl dedi ki:

    Merhabalar hocam bir konuda sizden bilgi almak istiyorum .net core 8 ile gelen Identity API Endpoints özelliğiyle bir çok kullancıı işlemlerini rahatlıkla yapabiliyoruz fakat şöyle bir durum var bu gelen endpointlerde login endpointini kullanırken oluşturulan token jwt.io da tanımlanılamazken postman ve swaggerda sorun olmadan çalışıyor ben bunu yazdığım bir projede login kısmında kullanmak istedim bir çok sayfada araştırma yaptım fakat çalıştıramadım token oluşturulmakta fakat uı kısmında hata vermekte bu konuda yardımcı olursanız çok sevinirim uı kısmında ise yine .net core web app (mvc) kullandım bu konu hakkında direkt bu bloğun altına yazmak istedim eğer benzer bir durum yaşayan arkadaşlar varsa eğer bu konu hakkındada bir yazı yazarsanız onlarında bu yazı üzerinden yazmış olucağınız yazıya gidebilmelerini sağlamak sevgiyle kalın iyi günler dilerim

Bir yanıt yazın

E-posta adresiniz yayınlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir