﻿
{"id":18415,"date":"2020-10-19T01:26:29","date_gmt":"2020-10-19T01:26:29","guid":{"rendered":"https:\/\/www.gencayyildiz.com\/blog\/?p=18415"},"modified":"2022-12-10T16:49:17","modified_gmt":"2022-12-10T16:49:17","slug":"identityserver4-yazi-serisi-4-cleam-bazli-yetkilendirme","status":"publish","type":"post","link":"https:\/\/www.gencayyildiz.com\/blog\/identityserver4-yazi-serisi-4-cleam-bazli-yetkilendirme\/","title":{"rendered":"IdentityServer4 Yaz\u0131 Serisi #4 &#8211; Claim Bazl\u0131 Yetkilendirme"},"content":{"rendered":"<div id=\"fb-root\"><\/div>\n<p>Merhaba,<\/p>\n<p><a href=\"https:\/\/www.gencayyildiz.com\/blog\/identityserver4-yazi-serisi\/\" rel=\"noopener noreferrer\" target=\"_blank\">IdentityServer4 Yaz\u0131 Serisi<\/a>nin \u00fc\u00e7\u00fcnc\u00fc makalesi olan <a href=\"https:\/\/www.gencayyildiz.com\/blog\/identityserver4-yazi-serisi-3-client-credentials\/\" rel=\"noopener noreferrer\" target=\"_blank\">Client Credentials<\/a> ba\u015fl\u0131kl\u0131 makalede IdentityServer4&#8217;\u00fcn pratiksel temelleri e\u015fli\u011finde i\u015flevsel mekanizmas\u0131na de\u011finmi\u015f ve bir yandan da sadece client&#8217;lar\u0131 yetkilendirme merkezli(Client Credentials) temel bir uygulama geli\u015ftirmi\u015ftik. Bu i\u00e7eri\u011fimizde ise yetkilendirmeyi bir ad\u0131m daha ilerletecek ve claim merkezli yetkilendirme ger\u00e7ekle\u015ftirece\u011fiz. Tabi konumuz bir b\u00fct\u00fcn olan yaz\u0131 serisinin k\u00fc\u00e7\u00fck bir par\u00e7as\u0131 olaca\u011f\u0131ndan dolay\u0131 bir \u00f6nceki makalede geli\u015ftirdi\u011fimiz uygulama \u00fczerinden devam niteli\u011finde anlat\u0131m sergileyece\u011fiz.<\/p>\n<h3 style=\"color:#e83e8c;\">Claim Nedir?<\/h3>\n<p>\u00d6ncelikle claim bazl\u0131 yetkilendirmenin ne oldu\u011funa de\u011finerek ba\u015flayal\u0131m. Bunun i\u00e7in claim&#8217;i tan\u0131mlamam\u0131z gerekmektedir. <a href=\"https:\/\/www.gencayyildiz.com\/blog\/asp-net-core-identity-yazi-dizisi\/\" rel=\"noopener noreferrer\" target=\"_blank\">Asp.NET Core Identity \u2013 Yaz\u0131 Dizisi<\/a>ni okuyanlar bilir ki, <a href=\"https:\/\/www.gencayyildiz.com\/blog\/asp-net-core-identity-claim-bazli-kimlik-dogrulama-xvii\/\" rel=\"noopener noreferrer\" target=\"_blank\">Claim Bazl\u0131 Kimlik Do\u011frulama<\/a> ba\u015fl\u0131kl\u0131 makalemizde claim&#8217;in ne oldu\u011funu detaylar\u0131yla a\u00e7\u0131klam\u0131\u015f bulunmaktay\u0131z. Hatta ilgili makaleden konuya dair al\u0131nt\u0131 yaparsak e\u011fer;<\/p>\n<blockquote><p><em>&#8230; <u>kullan\u0131c\u0131<\/u> hakk\u0131nda key \u2013 value \u015feklinde hususi bilgiler tutan ve bunlar\u0131 bizlere yapt\u0131\u011f\u0131m\u0131z talepler neticesinde getiren &#8230;<\/em><\/p><\/blockquote>\n<p>\u015feklinde tan\u0131mlama yap\u0131lmaktad\u0131r.<\/p>\n<p>\u0130\u015fte buradaki claim&#8217;i IdentityServer4 i\u00e7in kullan\u0131yorsak e\u011fer alt\u0131 \u00e7izili olan kullan\u0131c\u0131 yerine client(istemci) kelimesini koymam\u0131z yeterli olacak ve \u015f\u00f6yle bir anlam kar\u015f\u0131m\u0131za \u00e7\u0131kacakt\u0131r.<\/p>\n<p>Claim; IdentityServer4 mimarisinda client hakk\u0131nda key &#8211; value \u015feklinde hususi bilgiler tutan bir yap\u0131lanmad\u0131r. Yap\u0131lan taleplerde, client&#8217;tan gelen claim&#8217;ler Auth Server taraf\u0131ndan elde edilmekte ve i\u015flevsel a\u00e7\u0131dan de\u011ferlendirilmektedir. Buradaki i\u015flev genellikle client&#8217;\u0131 yetkilendirmek, yetki alanlar\u0131n\u0131 belirlemek \u00fczere \u015fekillenecektir.<\/p>\n<h3 style=\"color:#e83e8c;\">IdentityServer4&#8217;te Claim Nas\u0131l Tan\u0131mlan\u0131r?<\/h3>\n<p>Bu sorunun cevab\u0131n\u0131 esas\u0131nda bir \u00f6nceki makalemizde<span style=\"font-size:10px;\">(bknz: <a href=\"https:\/\/www.gencayyildiz.com\/blog\/identityserver4-yazi-serisi-3-client-credentials\/\" rel=\"noopener noreferrer\" target=\"_blank\">Client Credentials<\/a>)<\/span> vermi\u015f bulunmaktay\u0131z. \u0130lgili makaleye g\u00f6z atarsan\u0131z e\u011fer Auth Server uygulamas\u0131 i\u00e7in yap\u0131lan konfig\u00fcrasyon(Config.cs) tan\u0131mlamas\u0131nda client&#8217;lara yerle\u015ftirilen &#8216;AllowedScopes&#8217; alan\u0131 e\u015fli\u011findeki de\u011ferler, olu\u015fturulacak JWT&#8217;ye &#8216;scopes&#8217; key&#8217;i kar\u015f\u0131l\u0131\u011f\u0131nda payload olarak eklenmektedirler. B\u00f6ylece client&#8217;a ait token de\u011feri zaten, i\u00e7erisinde claim de\u011ferleri eklenmi\u015f vaziyette elde edilmektedir.<\/p>\n<p>Bu i\u00e7eri\u011fimizde, client&#8217;\u0131 bu scope de\u011ferlerine(claim) g\u00f6re yetkilendirmeyi ama\u00e7 edinmekteyiz. Bunun i\u00e7in direkt olarak API&#8217;lar da <a href=\"https:\/\/www.gencayyildiz.com\/blog\/asp-net-core-identity-politika-bazli-kimlik-dogrulama-xvi\/\" rel=\"noopener noreferrer\" target=\"_blank\">politikalar<\/a> olu\u015fturmam\u0131z yeterli ve yerinde olacakt\u0131r.<\/p>\n<h3 style=\"color:#e83e8c;\">API(lar)&#8217;da Claim Bazl\u0131 Politika(lar) Olu\u015fturma?<\/h3>\n<p>API uygulamas\u0131n\u0131n &#8216;Startup.cs&#8217; dosyas\u0131ndaki &#8216;ConfigureServices&#8217; metodunda a\u015fa\u011f\u0131daki gibi politikalar belirleyebilirsiniz.<\/p>\n<pre class=\"brush: jscript; title: ; notranslate\" title=\"\">\r\n    public class Startup\r\n    {\r\n        public void ConfigureServices(IServiceCollection services)\r\n        {\r\n            services.AddAuthentication(JwtBearerDefaults.AuthenticationScheme)\r\n                    .AddJwtBearer(JwtBearerDefaults.AuthenticationScheme, options =&gt;\r\n                    {\r\n                        options.Authority = &quot;https:\/\/localhost:1000&quot;;\r\n                        options.Audience = &quot;Garanti&quot;;\r\n                    });\r\n\r\n            services.AddAuthorization(_ =&gt;\r\n            {\r\n                _.AddPolicy(&quot;ReadGaranti&quot;, policy =&gt; policy.RequireClaim(&quot;scope&quot;, &quot;Garanti.Read&quot;));\r\n                _.AddPolicy(&quot;WriteGaranti&quot;, policy =&gt; policy.RequireClaim(&quot;scope&quot;, &quot;Garanti.Write&quot;));\r\n                _.AddPolicy(&quot;ReadWriteGaranti&quot;, policy =&gt; policy.RequireClaim(&quot;scope&quot;, &quot;Garanti.Write&quot;,&quot;Garanti.Read&quot;));\r\n                _.AddPolicy(&quot;AllGaranti&quot;, policy =&gt; policy.RequireClaim(&quot;scope&quot;, &quot;Garanti.Admin&quot;));\r\n                _.AddPolicy(&quot;ReadHalkBank&quot;, policy =&gt; policy.RequireClaim(&quot;scope&quot;, &quot;HalkBank.Read&quot;));\r\n                _.AddPolicy(&quot;WriteHalkBank&quot;, policy =&gt; policy.RequireClaim(&quot;scope&quot;, &quot;HalkBank.Write&quot;));\r\n                _.AddPolicy(&quot;ReadWriteHalkBank&quot;, policy =&gt; policy.RequireClaim(&quot;scope&quot;, &quot;HalkBank.Write&quot;, &quot;HalkBank.Read&quot;));\r\n                _.AddPolicy(&quot;AllHalkBank&quot;, policy =&gt; policy.RequireClaim(&quot;scope&quot;, &quot;HalkBank.Admin&quot;));\r\n            });\r\n        }\r\n        public void Configure(IApplicationBuilder app, IWebHostEnvironment env)\r\n        {\r\n            .\r\n            .\r\n            .\r\n            app.UseAuthentication();\r\n            app.UseAuthorization();\r\n            .\r\n            .\r\n            .\r\n        }\r\n    }\r\n<\/pre>\n<p>Art\u0131k uygulamada belli ba\u015fl\u0131 i\u015flemleri tarif eden politikalar mevcuttur. Yukar\u0131daki politikalara g\u00f6z atarsan\u0131z e\u011fer gelen istekteki token de\u011feri i\u00e7erisinde &#8216;scope&#8217; alan\u0131ndaki de\u011ferin kar\u015f\u0131l\u0131\u011f\u0131n\u0131 farkl\u0131 de\u011ferler ile \u015fart ko\u015fan birden fazla politika in\u015fa edilmi\u015ftir. E\u011fer ki bir politika &#8216;RequireClaim&#8217; ile zorunlulu\u011funu ifade ediyorsa burada claim bazl\u0131 bir politika s\u00f6z konusudur. Tabi ki de burada \u00e7ok daha farkl\u0131 t\u00fcrlerde politikalarda in\u015fa edilebilir. Lakin bizler konuyu fazla da\u011f\u0131tmamak ve i\u00e7erik olarak IdentityServer4&#8217;te ki authorization mant\u0131\u011f\u0131n\u0131 en sade haliyle aktarabilmek i\u00e7in bu ufak politikalar e\u015fli\u011finde yolumuza devam edelim.<\/p>\n<h3 style=\"color:#e83e8c;\">Action&#8217;lar\u0131 Politikalarla Yetkilendirme<\/h3>\n<p>\u015eimdi hangi action&#8217;\u0131n hangi politikay\u0131 benimseyece\u011fini bildirmemiz gerekmektedir. Bunun i\u00e7in a\u015fa\u011f\u0131daki gibi &#8216;Authorize&#8217; attribute&#8217;u ile \u00e7al\u0131\u015f\u0131lmas\u0131 yeterlidir;<\/p>\n<pre class=\"brush: jscript; title: ; notranslate\" title=\"\">\r\n    &#x5B;Route(&quot;api\/&#x5B;controller]\/&#x5B;action]&quot;)]\r\n    &#x5B;ApiController]\r\n    &#x5B;Authorize]\r\n    public class GarantiBankController : ControllerBase\r\n    {\r\n        &#x5B;HttpGet(&quot;{musteriId}&quot;)]\r\n        &#x5B;Authorize(Policy = &quot;ReadGaranti&quot;)]\r\n        public double Bakiye(int musteriId)\r\n        {\r\n            \/\/....\r\n            return 1000;\r\n        }\r\n        &#x5B;HttpGet(&quot;{musteriId}\/{tutar}&quot;)]\r\n        &#x5B;Authorize(Policy = &quot;AllGaranti&quot;)]\r\n        public double YatirimYap(int musteriId, double tutar)\r\n        {\r\n            return tutar * 0.5;\r\n        }\r\n        .\r\n        .\r\n        .\r\n    }\r\n<\/pre>\n<p>Burada &#8216;Authorize&#8217; attribute&#8217;u, ilgili action&#8217;a eri\u015fim yetkisini s\u0131n\u0131rland\u0131r\u0131rken biryandan da &#8216;Policy&#8217; property&#8217;sine bildirilen politika ismi ile ilgili politikan\u0131n \u015fartlar\u0131n\u0131n do\u011frulanmas\u0131n\u0131 da zorunlu hale getirmektedir. Evet, ilgili action&#8217;lar belirtilen politikalardaki \u015fart\u0131 sa\u011flayan client&#8217;lar taraf\u0131ndan tetiklenecektir. B\u00f6ylece sadece token&#8217;\u0131n var olmas\u0131 yeterli olmayacak bir yandan da ta\u015f\u0131d\u0131\u011f\u0131 claim de\u011ferleri i\u00e7erisinde buradaki &#8216;scope&#8217; gereklili\u011fini sa\u011flayacak olan de\u011feri de ta\u015f\u0131yor olmas\u0131 gerekecektir.<\/p>\n<h3 style=\"color:#e83e8c;\">Test<\/h3>\n<p>Auth Server dahil t\u00fcm API&#8217;lar\u0131 aya\u011fa kald\u0131rarak, client olarak Postman e\u015fli\u011finde a\u015fa\u011f\u0131daki gibi bir test ger\u00e7ekle\u015ftirelim;<\/p>\n<table>\n<tbody>\n<tr>\n<td style=\"width:30px;\"><em>Client JWT olmaks\u0131z\u0131n istek g\u00f6nderdi\u011finde<\/em><\/td>\n<td>\n<a href=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2020\/10\/IdentityServer4-Yazi-Serisi-4-Cleam-Bazli-Yetkilendirme.jpg\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2020\/10\/IdentityServer4-Yazi-Serisi-4-Cleam-Bazli-Yetkilendirme-300x109.jpg\" alt=\"IdentityServer4 Yaz\u0131 Serisi #4 - Cleam Bazl\u0131 Yetkilendirme\" width=\"300\" height=\"109\" class=\"aligncenter size-medium wp-image-18444\" srcset=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2020\/10\/IdentityServer4-Yazi-Serisi-4-Cleam-Bazli-Yetkilendirme-300x109.jpg 300w, https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2020\/10\/IdentityServer4-Yazi-Serisi-4-Cleam-Bazli-Yetkilendirme-768x278.jpg 768w, https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2020\/10\/IdentityServer4-Yazi-Serisi-4-Cleam-Bazli-Yetkilendirme.jpg 834w\" sizes=\"auto, (max-width: 300px) 100vw, 300px\" \/><\/a><\/p>\n<p><a href=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2020\/10\/IdentityServer4-Yazi-Serisi-4-Cleam-Bazli-Yetkilendirme-2.jpg\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2020\/10\/IdentityServer4-Yazi-Serisi-4-Cleam-Bazli-Yetkilendirme-2-300x109.jpg\" alt=\"IdentityServer4 Yaz\u0131 Serisi #4 - Cleam Bazl\u0131 Yetkilendirme\" width=\"300\" height=\"109\" class=\"aligncenter size-medium wp-image-18446\" srcset=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2020\/10\/IdentityServer4-Yazi-Serisi-4-Cleam-Bazli-Yetkilendirme-2-300x109.jpg 300w, https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2020\/10\/IdentityServer4-Yazi-Serisi-4-Cleam-Bazli-Yetkilendirme-2-768x279.jpg 768w, https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2020\/10\/IdentityServer4-Yazi-Serisi-4-Cleam-Bazli-Yetkilendirme-2.jpg 832w\" sizes=\"auto, (max-width: 300px) 100vw, 300px\" \/><\/a>\n<\/td>\n<\/tr>\n<tr>\n<td><em>&#8216;Garanti.Read&#8217; ve &#8216;Garanti.Write&#8217; yetkilerine(scope) sahip olan &#8216;GarantiBankasi&#8217; client&#8217;\u0131na ait bir JWT elde etme<\/em><\/td>\n<td>\n<a href=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2020\/10\/IdentityServer4-Yazi-Serisi-4-Cleam-Bazli-Yetkilendirme-1.jpg\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2020\/10\/IdentityServer4-Yazi-Serisi-4-Cleam-Bazli-Yetkilendirme-1-300x176.jpg\" alt=\"IdentityServer4 Yaz\u0131 Serisi #4 - Cleam Bazl\u0131 Yetkilendirme\" width=\"300\" height=\"176\" class=\"aligncenter size-medium wp-image-18445\" srcset=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2020\/10\/IdentityServer4-Yazi-Serisi-4-Cleam-Bazli-Yetkilendirme-1-300x176.jpg 300w, https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2020\/10\/IdentityServer4-Yazi-Serisi-4-Cleam-Bazli-Yetkilendirme-1-768x452.jpg 768w, https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2020\/10\/IdentityServer4-Yazi-Serisi-4-Cleam-Bazli-Yetkilendirme-1.jpg 840w\" sizes=\"auto, (max-width: 300px) 100vw, 300px\" \/><\/a>\n<\/td>\n<\/tr>\n<tr>\n<td><em>JWT ile istek g\u00f6nderme<\/em><\/td>\n<td><a href=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2020\/10\/IdentityServer4-Yazi-Serisi-4-Cleam-Bazli-Yetkilendirme-3.jpg\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2020\/10\/IdentityServer4-Yazi-Serisi-4-Cleam-Bazli-Yetkilendirme-3-300x105.jpg\" alt=\"IdentityServer4 Yaz\u0131 Serisi #4 - Cleam Bazl\u0131 Yetkilendirme\" width=\"300\" height=\"105\" class=\"aligncenter size-medium wp-image-18448\" srcset=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2020\/10\/IdentityServer4-Yazi-Serisi-4-Cleam-Bazli-Yetkilendirme-3-300x105.jpg 300w, https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2020\/10\/IdentityServer4-Yazi-Serisi-4-Cleam-Bazli-Yetkilendirme-3-768x268.jpg 768w, https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2020\/10\/IdentityServer4-Yazi-Serisi-4-Cleam-Bazli-Yetkilendirme-3.jpg 842w\" sizes=\"auto, (max-width: 300px) 100vw, 300px\" \/><\/a><br \/>\nG\u00f6r\u00fcld\u00fc\u011f\u00fc \u00fczere sadece &#8216;Garanti.Read&#8217; yetkisini gerektiren &#8216;ReadGaranti&#8217; politikas\u0131n\u0131 uygulayan &#8216;Bakiye&#8217; action&#8217;\u0131 token ile yap\u0131lan talebi do\u011frulad\u0131 ve \u00e7al\u0131\u015ft\u0131.<br \/>\n<a href=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2020\/10\/IdentityServer4-Yazi-Serisi-4-Cleam-Bazli-Yetkilendirme-4.jpg\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2020\/10\/IdentityServer4-Yazi-Serisi-4-Cleam-Bazli-Yetkilendirme-4-300x115.jpg\" alt=\"IdentityServer4 Yaz\u0131 Serisi #4 - Cleam Bazl\u0131 Yetkilendirme\" width=\"300\" height=\"115\" class=\"aligncenter size-medium wp-image-18449\" srcset=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2020\/10\/IdentityServer4-Yazi-Serisi-4-Cleam-Bazli-Yetkilendirme-4-300x115.jpg 300w, https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2020\/10\/IdentityServer4-Yazi-Serisi-4-Cleam-Bazli-Yetkilendirme-4-768x295.jpg 768w, https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2020\/10\/IdentityServer4-Yazi-Serisi-4-Cleam-Bazli-Yetkilendirme-4.jpg 770w\" sizes=\"auto, (max-width: 300px) 100vw, 300px\" \/><\/a><br \/>\nHalbuki &#8216;Garanti.Admin&#8217; yetkisini gerektiren &#8216;AllGaranti&#8217; isimli politikay\u0131 uygulayan &#8216;YatirimYap&#8217; action&#8217;\u0131, request i\u00e7erisindeki token&#8217;da ilgili yetkiye kar\u015f\u0131l\u0131k gelen bir scope olmad\u0131\u011f\u0131 i\u00e7in iste\u011fi onaylamad\u0131 ve 403 hata kodu d\u00f6nd\u00fcrd\u00fc. 403 hata kodu 401&#8217;e nazaran; token&#8217;\u0131n var lakin yetkin\/scope yok\/yetersiz anlam\u0131na gelmektedir.\n<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<p>Netice olarak claim bazl\u0131 yetkilendirme, claim bazl\u0131 politika tasarlamam\u0131z\u0131 ve ilgili controller ya da action&#8217;lar\u0131n bu politikalar ile davran\u0131\u015flar\u0131n\u0131 \u015fekillendirmemizi gerektiren ve b\u00f6ylece token&#8217;dan ziyade, token&#8217;\u0131 var olan client&#8217;lar aras\u0131nda yetki ayr\u0131m\u0131n\u0131 ger\u00e7ekle\u015ftirmemizi sa\u011flayan bir yap\u0131lanmad\u0131r. Tasar\u0131msal a\u00e7\u0131dan sizlerin de taktir edece\u011fi gibi kurumsal yap\u0131lanmalarda ihtiya\u00e7lara binaen olduk\u00e7a efektif \u00e7\u00f6z\u00fcmler getirmemizi sa\u011flayan olmazsa olmaz tekniklerimizden birisidir diyebiliriz&#8230;<\/p>\n<p>\u0130lgilenenlerin faydalanmas\u0131 dile\u011fiyle&#8230;<br \/>\nSonraki yaz\u0131lar\u0131mda g\u00f6r\u00fc\u015fmek \u00fczere&#8230;<br \/>\n\u0130yi \u00e7al\u0131\u015fmalar&#8230;<\/p>\n<p>Not : \u00d6rnek uygulamay\u0131 indirmek i\u00e7in <a href=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2020\/10\/IdentityServer4Example-1.zip\">buraya<\/a> t\u0131klay\u0131n\u0131z.<\/p>\n<!-- AddThis Advanced Settings generic via filter on the_content --><!-- AddThis Share Buttons generic via filter on the_content -->","protected":false},"excerpt":{"rendered":"<p>Merhaba, IdentityServer4 Yaz\u0131 Serisinin \u00fc\u00e7\u00fcnc\u00fc makalesi olan Client Credentials ba\u015fl\u0131kl\u0131 makalede IdentityServer4&#8217;\u00fcn pratiksel temelleri e\u015fli\u011finde i\u015flevsel mekanizmas\u0131na de\u011finmi\u015f ve bir yandan da sadece client&#8217;lar\u0131 yetkilendirme merkezli(Client Credentials) temel bir uygulama geli\u015ftirmi\u015ftik. Bu i\u00e7eri\u011fimizde ise&#46;&#46;&#46;<!-- AddThis Advanced Settings generic via filter on get_the_excerpt --><!-- AddThis Share Buttons generic via filter on get_the_excerpt --><\/p>\n","protected":false},"author":1,"featured_media":18168,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[3826],"tags":[3856,3827,3854,3855,3853],"class_list":["post-18415","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-identityserver4","tag-claim-based","tag-identityserver4","tag-identityserver4-claim","tag-identityserver4-claim-based","tag-identityserver4-claim-bazli-yetkilendirme"],"amp_enabled":true,"_links":{"self":[{"href":"https:\/\/www.gencayyildiz.com\/blog\/wp-json\/wp\/v2\/posts\/18415","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.gencayyildiz.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.gencayyildiz.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.gencayyildiz.com\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.gencayyildiz.com\/blog\/wp-json\/wp\/v2\/comments?post=18415"}],"version-history":[{"count":33,"href":"https:\/\/www.gencayyildiz.com\/blog\/wp-json\/wp\/v2\/posts\/18415\/revisions"}],"predecessor-version":[{"id":25986,"href":"https:\/\/www.gencayyildiz.com\/blog\/wp-json\/wp\/v2\/posts\/18415\/revisions\/25986"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.gencayyildiz.com\/blog\/wp-json\/wp\/v2\/media\/18168"}],"wp:attachment":[{"href":"https:\/\/www.gencayyildiz.com\/blog\/wp-json\/wp\/v2\/media?parent=18415"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.gencayyildiz.com\/blog\/wp-json\/wp\/v2\/categories?post=18415"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.gencayyildiz.com\/blog\/wp-json\/wp\/v2\/tags?post=18415"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}