Merhaba,
Bir önceki Merkezi Üyelik Sistemi – Claim ve Authentication Propertyleri Okuma başlıklı makalemizde IdentityServer4 mimarisinden claim bilgileri ile birlikte access token, refresh token gibi değerlerin nasıl alındığını incelemiştik. Bu içeriğimizde ise client tarafından elde edilen access token ile IdentityServer4 tarafından korunan API’lara nasıl erişilebildiğini inceleyeceğiz.
Client’a Scope(Erişim Yetkisi) Verme?
Client, her ne kadar access token bilgisini elinde barındırıyor olsada erişmek istediği API’ın ‘Scope’larını da barındırması gerekmektedir. Misal; ‘GarantiAPI’ isimli API’a erişmek istediğimizi varsayalım.
Şöyle ki;
Bu işlemden sonra client tarafından istenilen scope’lar(yetkiler) birde ilgili client uygulamasının ‘Startup.cs’ dosyasında da bildirilmelidir.
Client uygulamasında bu işlemi yapmamızın sebebi, IdentityServer’da(Auth Server) kendisine dair oluşturulmuş client’ta bu scope değerleri tanımlanmış olup olmamasını check etmesidir. Aksi taktirde, IdentityServer tarafında tanımlı olan client’a verilmeyen bir scope değeri, client tarafından talep edilirse hata meydana gelecektir.
Yapılan bu konfigürasyonlardan sonra artık uygulamayı test edebiliriz.
Test Edelim
Test için öncelikle client tarafından giriş yapılmalı ve ardından bu ayarlarda(yani belirtilen scope değerlerinde) yetkileri barındıran access token elde edilmelidir.
Postman İle Test
Access token ile Postman üzerinden yapılan istek neticesinde görüldüğü üzere başarıyla authorized olunmakta ve haberleşme sağlanmaktadır.
Client Uygulaması İle Test
Client uygulaması üzerinden access token’ı kullanarak API ile haberleşmek istiyorsanız eğer aşağıdaki gibi bir çalışma sergileyebilirsiniz;
[Authorize]
public async Task<IActionResult> OdemeYap()
{
var authenticationProperties = (await HttpContext.AuthenticateAsync()).Properties.Items;
string accessToken = authenticationProperties.FirstOrDefault(x => x.Key == ".Token.access_token").Value;
HttpClient httpClient = new HttpClient();
httpClient.DefaultRequestHeaders.Add("Authorization", $"Bearer {accessToken}");
HttpResponseMessage responseMessage = await httpClient.GetAsync("https://localhost:2000/api/garantibank/bakiye/3");
string bakiye = await responseMessage.Content.ReadAsStringAsync();
ViewBag.Bakiye = bakiye;
return View();
}
Görüldüğü üzere her iki testimizde başarıyla sonuçlanmıştır.
İlgilenenlerin faydalanması dileğiyle…
Sonraki yazılarımda görüşmek üzere…
İyi çalışmalar…
Not : Örnek çalışma dosyasını indirmek için buraya tıklayınız.
