﻿
{"id":28379,"date":"2026-02-04T18:53:24","date_gmt":"2026-02-04T18:53:24","guid":{"rendered":"https:\/\/www.gencayyildiz.com\/blog\/?p=28379"},"modified":"2026-02-04T19:54:52","modified_gmt":"2026-02-04T19:54:52","slug":"asp-net-core-uygulamalarinda-keycloak-ile-temel-authentication-islemleri-6","status":"publish","type":"post","link":"https:\/\/www.gencayyildiz.com\/blog\/asp-net-core-uygulamalarinda-keycloak-ile-temel-authentication-islemleri-6\/","title":{"rendered":"Asp.NET Core Uygulamalar\u0131nda Keycloak \u0130le Temel Authentication \u0130\u015flemleri #6"},"content":{"rendered":"<div id=\"fb-root\"><\/div>\n<p>Merhaba,<br \/>\n<br \/>\nBu i\u00e7eri\u011fimizde Keycloak&#8217;da en temel seviyede authentication i\u015flemlerini ele alacak ve \u00fcretilmi\u015f bir token&#8217;\u0131n hem manuel hem de <code>.AddAuthentication()<\/code> middleware&#8217;i ile profesyonel do\u011frulamalar\u0131n\u0131n nas\u0131l yap\u0131laca\u011f\u0131n\u0131 de\u011ferlendiriyor olaca\u011f\u0131z. Tabi t\u00fcm bu \u00e7al\u0131\u015fma boyunca s\u00fcrece dair gerekli detaylar\u0131 masaya yat\u0131rm\u0131\u015f ve Keycloak&#8217;da ki &#8216;<em>Public Key<\/em>&#8216; ve &#8216;<em>JWTKS<\/em>&#8216; kavramlar\u0131n\u0131n mahiyetini de net bir \u015fekilde anlam\u0131\u015f olaca\u011f\u0131z. O halde buyurun ba\u015flayal\u0131m&#8230;<\/p>\n<div id=\"ez-toc-container\" class=\"ez-toc-v2_0_88 counter-hierarchy ez-toc-counter ez-toc-light-blue ez-toc-container-direction\">\n<div class=\"ez-toc-title-container\">\n<p class=\"ez-toc-title\" style=\"cursor:inherit\">Ba\u015fl\u0131klar<\/p>\n<span class=\"ez-toc-title-toggle\"><a href=\"#\" class=\"ez-toc-pull-right ez-toc-btn ez-toc-btn-xs ez-toc-btn-default ez-toc-toggle\" aria-label=\"\u0130\u00e7indekiler Tablosunu A\u00e7\/Kapat\"><span class=\"ez-toc-js-icon-con\"><span class=\"\"><span class=\"eztoc-hide\" style=\"display:none;\">Toggle<\/span><span class=\"ez-toc-icon-toggle-span\"><svg style=\"fill: #999;color:#999\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\" class=\"list-377408\" width=\"20px\" height=\"20px\" viewBox=\"0 0 24 24\" fill=\"none\"><path d=\"M6 6H4v2h2V6zm14 0H8v2h12V6zM4 11h2v2H4v-2zm16 0H8v2h12v-2zM4 16h2v2H4v-2zm16 0H8v2h12v-2z\" fill=\"currentColor\"><\/path><\/svg><svg style=\"fill: #999;color:#999\" class=\"arrow-unsorted-368013\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"10px\" height=\"10px\" viewBox=\"0 0 24 24\" version=\"1.2\" baseProfile=\"tiny\"><path d=\"M18.2 9.3l-6.2-6.3-6.2 6.3c-.2.2-.3.4-.3.7s.1.5.3.7c.2.2.4.3.7.3h11c.3 0 .5-.1.7-.3.2-.2.3-.5.3-.7s-.1-.5-.3-.7zM5.8 14.7l6.2 6.3 6.2-6.3c.2-.2.3-.5.3-.7s-.1-.5-.3-.7c-.2-.2-.4-.3-.7-.3h-11c-.3 0-.5.1-.7.3-.2.2-.3.5-.3.7s.1.5.3.7z\"\/><\/svg><\/span><\/span><\/span><\/a><\/span><\/div>\n<nav><ul class='ez-toc-list ez-toc-list-level-1 ' ><li class='ez-toc-page-1 ez-toc-heading-level-4'><a class=\"ez-toc-link ez-toc-heading-1\" href=\"https:\/\/www.gencayyildiz.com\/blog\/asp-net-core-uygulamalarinda-keycloak-ile-temel-authentication-islemleri-6\/#Keycloakda_Uretilmis_Tokeni_AspNET_Coreda_Dogrularken%E2%80%A6\" >Keycloak&#8217;da \u00dcretilmi\u015f Token&#8217;\u0131 Asp.NET Core&#8217;da Do\u011frularken&#8230;<\/a><ul class='ez-toc-list-level-5' ><li class='ez-toc-heading-level-5'><a class=\"ez-toc-link ez-toc-heading-2\" href=\"https:\/\/www.gencayyildiz.com\/blog\/asp-net-core-uygulamalarinda-keycloak-ile-temel-authentication-islemleri-6\/#Authentication_Surecinde_Public_Key_Nedir_Ne_Ise_Yaramaktadir\" >Authentication S\u00fcrecinde Public Key Nedir? Ne \u0130\u015fe Yaramaktad\u0131r?<\/a><\/li><\/ul><\/li><li class='ez-toc-page-1 ez-toc-heading-level-4'><a class=\"ez-toc-link ez-toc-heading-3\" href=\"https:\/\/www.gencayyildiz.com\/blog\/asp-net-core-uygulamalarinda-keycloak-ile-temel-authentication-islemleri-6\/#Manuel_Olarak_Tokeni_Validate_Edelim%E2%80%A6\" >Manuel Olarak Token&#8217;\u0131 Validate Edelim&#8230;<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-4'><a class=\"ez-toc-link ez-toc-heading-4\" href=\"https:\/\/www.gencayyildiz.com\/blog\/asp-net-core-uygulamalarinda-keycloak-ile-temel-authentication-islemleri-6\/#Yari_Manuel_Olarak_Tokeni_Validate_Edelim%E2%80%A6\" >Yar\u0131 Manuel Olarak Token&#8217;\u0131 Validate Edelim&#8230;<\/a><ul class='ez-toc-list-level-5' ><li class='ez-toc-heading-level-5'><a class=\"ez-toc-link ez-toc-heading-5\" href=\"https:\/\/www.gencayyildiz.com\/blog\/asp-net-core-uygulamalarinda-keycloak-ile-temel-authentication-islemleri-6\/#Manuel_Dogrulamanin_Getirdigi_Sikintilar\" >Manuel Do\u011frulaman\u0131n Getirdi\u011fi S\u0131k\u0131nt\u0131lar<\/a><\/li><\/ul><\/li><li class='ez-toc-page-1 ez-toc-heading-level-4'><a class=\"ez-toc-link ez-toc-heading-6\" href=\"https:\/\/www.gencayyildiz.com\/blog\/asp-net-core-uygulamalarinda-keycloak-ile-temel-authentication-islemleri-6\/#Profesyonel_Yol_%E2%80%93_AddAuthenticationAddJwtBearer\" >Profesyonel Yol \u2013 .AddAuthentication().AddJwtBearer()<\/a><\/li><\/ul><\/nav><\/div>\n<h4><span class=\"ez-toc-section\" id=\"Keycloakda_Uretilmis_Tokeni_AspNET_Coreda_Dogrularken%E2%80%A6\"><\/span>Keycloak&#8217;da \u00dcretilmi\u015f Token&#8217;\u0131 Asp.NET Core&#8217;da Do\u011frularken&#8230;<span class=\"ez-toc-section-end\"><\/span><\/h4>\n<p>Keycloak&#8217;da \u00fcretilmi\u015f bir token&#8217;\u0131 Asp.NET Core&#8217;da do\u011frularken ba\u015fta kimin hangi sorumluluklara sahip oldu\u011funun fark\u0131n\u0131 \u00e7izmekte fayda g\u00f6rmekteyim. \u015e\u00f6yle ki; s\u00fcre\u00e7te Keycloak&#8217;un fiili g\u00f6revi yaln\u0131zca token (JWT) \u00fcretimidir. Bu token&#8217;\u0131n do\u011frulanma sorumlulu\u011fu ise sade ve sadece Asp.NET Core uygulamas\u0131ndad\u0131r.<\/p>\n<p><a href=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2026\/02\/Asp.NET-Core-Uygulamalarinda-Keycloak-Ile-Temel-Authentication-Islemleri-6.png\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2026\/02\/Asp.NET-Core-Uygulamalarinda-Keycloak-Ile-Temel-Authentication-Islemleri-6-300x200.png\" alt=\"Asp.NET Core Uygulamalar\u0131nda Keycloak \u0130le Temel Authentication \u0130\u015flemleri #6\" width=\"300\" height=\"200\" class=\"alignleft size-medium wp-image-28386\" srcset=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2026\/02\/Asp.NET-Core-Uygulamalarinda-Keycloak-Ile-Temel-Authentication-Islemleri-6-300x200.png 300w, https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2026\/02\/Asp.NET-Core-Uygulamalarinda-Keycloak-Ile-Temel-Authentication-Islemleri-6-1024x683.png 1024w, https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2026\/02\/Asp.NET-Core-Uygulamalarinda-Keycloak-Ile-Temel-Authentication-Islemleri-6-768x512.png 768w, https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2026\/02\/Asp.NET-Core-Uygulamalarinda-Keycloak-Ile-Temel-Authentication-Islemleri-6.png 1536w\" sizes=\"auto, (max-width: 300px) 100vw, 300px\" \/><\/a>Haliyle bu do\u011frulama s\u00fcrecinde Asp.NET Core;<\/p>\n<ul style=\"font-size:14px;\">\n<li>Bu token ger\u00e7ekten ilgili Keycloak taraf\u0131ndan m\u0131 \u00fcretildi?<\/li>\n<li>\u0130mzas\u0131 do\u011fru mu?<\/li>\n<li>S\u00fcresi dolmu\u015f mu?<\/li>\n<li>Audience \/ issuer bilgileri do\u011fru mu?<\/li>\n<\/ul>\n<p>\u015feklinde sorular sorarak gerekli kontrolleri sa\u011flamakla m\u00fckelleftir. Bunun nedeni, d\u00fcnyadaki say\u0131s\u0131z ge\u00e7erli\/ge\u00e7ersiz token aras\u0131ndan yaln\u0131zca tasarlanan sisteme ait, g\u00fcvenilen ya da kabul edilen otorite taraf\u0131ndan \u00fcretilmi\u015f token&#8217;lar\u0131 ay\u0131rt edebilmektir. Ne de olsa, sisteme gelen her token JWT yap\u0131s\u0131 gere\u011fi ge\u00e7erli g\u00f6r\u00fcnebilir, ancak bu token&#8217;\u0131n ger\u00e7ekten beklenen issuer ve audience de\u011ferleriyle olu\u015fturulup olu\u015fturulmad\u0131\u011f\u0131, ve ge\u00e7erli bir imzaya ve s\u00fcreye sahip olup olmad\u0131\u011f\u0131 tasarlad\u0131\u011f\u0131m\u0131z sistemimiz i\u00e7in olduk\u00e7a \u00f6nem arz edecektir. <\/p>\n<p>B\u00f6ylece her <em>-selam\u00fcn aleyk\u00fcm-<\/em> diyen token&#8217;\u0131 kabul etmeyecek, yaln\u0131zca kendi sistemimize ait, g\u00fcvendi\u011fimiz identity provider taraf\u0131ndan \u00fcretilmi\u015f token&#8217;lar\u0131 ay\u0131klay\u0131p kabul etmi\u015f olaca\u011f\u0131z.<\/p>\n<p>Bunu ger\u00e7ek hayattaki tiyatro biletleriyle ayn\u0131 mant\u0131k olarak d\u00fc\u015f\u00fcnebiliriz. Nas\u0131l ki bir tiyatro oyununa girilebilmesi i\u00e7in d\u00fcnyada \u00fcretilmi\u015f herhangi bir bilete de\u011fil, sadece o oyuna ait, ve o oyunun organizat\u00f6r\u00fc taraf\u0131ndan bas\u0131lm\u0131\u015f bir bilete ihtiya\u00e7 varsa evet, ayn\u0131 mant\u0131k birebir token i\u00e7in de ge\u00e7erlidir. Nas\u0131l ki, bir tiyatro biletinde hangi oyuna ait oldu\u011fu, hangi organizat\u00f6r taraf\u0131ndan bas\u0131ld\u0131\u011f\u0131, ge\u00e7erlilik s\u00fcresinin <span style=\"font-size:12px;\">(ki oyun tarihi ge\u00e7tiyse yine ge\u00e7ersizdir)<\/span> ne kadar oldu\u011fu ve biletin sahte mi ger\u00e7ek mi oldu\u011fu bilgileri mevcutsa, token&#8217;da da bu tarz sisteme \u00f6zel do\u011frulay\u0131c\u0131 parametreler mevzu bahistir diyebiliriz.<\/p>\n<h5><span class=\"ez-toc-section\" id=\"Authentication_Surecinde_Public_Key_Nedir_Ne_Ise_Yaramaktadir\"><\/span>Authentication S\u00fcrecinde Public Key Nedir? Ne \u0130\u015fe Yaramaktad\u0131r?<span class=\"ez-toc-section-end\"><\/span><\/h5>\n<p>Keycloak&#8217;taki <em>Public Key<\/em>, Keycloak&#8217;un \u00fcretti\u011fi token&#8217;lar\u0131 imzalarken kulland\u0131\u011f\u0131 RSA veya ECDSA gibi asimetrik \u015fifreleme anahtar \u00e7iftinin public k\u0131sm\u0131d\u0131r. <\/p>\n<blockquote><p><em>Keycloak; token \u00fcretirken private key ile imzalar, bu token&#8217;\u0131 do\u011frulayan sistemler ise public key ile bu imzay\u0131 kontrole tabi tutar.<\/em><\/p><\/blockquote>\n<p>Keycloak, kullan\u0131c\u0131lar\u0131 do\u011frulad\u0131ktan sonra uygulamalara (client&#8217;lara) genellikle JWT format\u0131nda token&#8217;\u0131 verirken, bu token&#8217;\u0131 dijital olarak imzalamaktad\u0131r (signed) Bu imzalama private key taraf\u0131ndan Keycloak sunucusunda ger\u00e7ekle\u015ftirilir. Uygulamalar ise public key ile <em>-bu token ger\u00e7ekten ilgili Keycloak taraf\u0131ndan m\u0131 olu\u015fturuldu?-<\/em>, <em>-hi\u00e7 de\u011fi\u015ftirilmedi mi?-<\/em> \u015feklinde sorular\u0131n cevab\u0131n\u0131 arar.<\/p>\n<p><strong>Neden public key&#8217;e ihtiya\u00e7 vard\u0131r?<\/strong><br \/>\n\u00c7\u00fcnk\u00fc modern mimarilerde <span style=\"font-size:12px;\">(\u00f6zellikle microservice, API Gateway, SPA + backend kombinasyonlar\u0131)<\/span> token do\u011frulamas\u0131 i\u00e7in merkezi olan authorization server&#8217;a <span style=\"font-size:12px;\">(bizdeki mevzu bahis Keycloak)<\/span> her istekte dan\u0131\u015fmak pek do\u011fru de\u011fildir. D\u00fc\u015f\u00fcnsenize&#8230; Bir istek geliyor ve authorization server&#8217;a gidip <em>-bu iste\u011fi yapan token senden mi?-<\/em> diye soruyoruz. Sonra bir ba\u015fka istekte yine soruyoruz. Sonra bir ba\u015fkas\u0131nda yine&#8230; B\u00f6yle bir durumda authorization server sanki amac\u0131ndan sap\u0131p do\u011frulama s\u00fcrecine e\u015flik eden farkl\u0131 bir misyona sahipmi\u015f gibi olacakt\u0131r. Halbuki token do\u011frulamas\u0131n\u0131n en do\u011frusu, yerel olarak do\u011frulamad\u0131r. Yani ilgili uygulamada\/API&#8217;de\/client&#8217;ta do\u011frulama yapmakt\u0131r. \u0130\u015fte bunun i\u00e7in public key kullan\u0131lmaktad\u0131r. Public key bir kez al\u0131nmakta ve servisler taraf\u0131ndan bu anahtar de\u011fer kullan\u0131larak kendi ba\u015flar\u0131na token do\u011frulamas\u0131 ger\u00e7ekle\u015ftirilmektedir.<\/p>\n<p>E\u011fer public key olmasayd\u0131, her istekte Keycloak&#8217;a <em>-bu token ge\u00e7erli mi?-<\/em> diye sormak zorunda kalacak, b\u00f6ylece a\u011f trafi\u011fini art\u0131racakt\u0131k. Halbuki public key sayesinde daha h\u0131zl\u0131 do\u011frulama s\u00fcreci sa\u011flayabilmekte, a\u011f trafi\u011fini azaltabilmekte ve performanstan ciddi kazan\u00e7 elde edilebilmektedir. Ayr\u0131ca Keycloak sunucusu gitse bile mevcut token&#8217;lar\u0131n expire s\u00fcresi boyunca \u00e7al\u0131\u015fmaya devam etmesi bile sa\u011flanabilmektedir.<\/p>\n<blockquote><p><em>Public key ile sa\u011flanan bu modele <strong>Stateless Authenticaiton<\/strong> denmektedir.<\/em><\/p><\/blockquote>\n<p><strong>Peki public key nereden al\u0131n\u0131r?<\/strong><br \/>\nPublic key&#8217;i alabilmek i\u00e7in Keycloak&#8217;un sundu\u011fu a\u015fa\u011f\u0131daki endpoint&#8217;inden istifade edebiliriz:<\/p>\n<div style=\"background: #0f172a;color: #38bdf8;padding: 16px 20px;border-radius: 12px;font-family: system-ui, -apple-system, sans-serif;border: 1px solid #334155;margin: 1.2em 0;box-shadow: 0 4px 15px rgba(0,0,0,0.25);text-decoration: none;font-weight: 500;word-break: break-all;transition: color 0.2s;\">\n    <strong style=\"color:#60a5fa;font-size:15px;\">\ud83d\udd17 \/realms\/{realm}\/protocol\/openid-connect\/certs<br \/>\n<\/strong>\n<\/div>\n<p><a href=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2026\/02\/Asp.NET-Core-Uygulamalarinda-Keycloak-Ile-Temel-Authentication-Islemleri-6-1.png\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2026\/02\/Asp.NET-Core-Uygulamalarinda-Keycloak-Ile-Temel-Authentication-Islemleri-6-1.png\" alt=\"Asp.NET Core Uygulamalar\u0131nda Keycloak \u0130le Temel Authentication \u0130\u015flemleri #6\" width=\"378\" height=\"615\" class=\"alignleft size-full wp-image-28388\" srcset=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2026\/02\/Asp.NET-Core-Uygulamalarinda-Keycloak-Ile-Temel-Authentication-Islemleri-6-1.png 378w, https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2026\/02\/Asp.NET-Core-Uygulamalarinda-Keycloak-Ile-Temel-Authentication-Islemleri-6-1-184x300.png 184w\" sizes=\"auto, (max-width: 378px) 100vw, 378px\" \/><\/a>Bu endpoint&#8217;e yap\u0131lan <em>GET<\/em> iste\u011fi neticesinde public key bizlere yandaki g\u00f6rselde oldu\u011fu gibi JWKS (JSON Web Key Set) format\u0131nda d\u00f6necektir.<\/p>\n<p>Dikkat ederseniz, biri <code>RSA-OAEP<\/code> bir di\u011feri ise <code>RS256<\/code> algoritmalar\u0131nda olu\u015fturulmu\u015f farkl\u0131 ama\u00e7lara sahip iki adet RSA anahtar\u0131 g\u00f6r\u00fcyoruz.<\/p>\n<p>Bunlardan;<\/p>\n<p><code>RSA-OAEP<\/code>, Keycloak&#8217;un token&#8217;lar\u0131 \u015fifrelemek i\u00e7in kulland\u0131\u011f\u0131 anahtar\u0131n ta kendisidir. Ama dikkat, bu de\u011fer public key de\u011fil, private key&#8217;dir. \u00c7\u00fcnk\u00fc mevzu bahis \u015fifrelemeyse o taktirde bu \u015fifreyi \u00e7\u00f6zebilmek i\u00e7in bizlerin kesinlikle private key&#8217;e ihtiyac\u0131 olacakt\u0131r. O y\u00fczden<br \/>\n<code>RSA-OAEP<\/code>, pek \u00f6nerilmemekte ya da daha do\u011fru ifadeyle \u00e7o\u011fu projede tercih edilmemektedir.<\/p>\n<p><code>RS256<\/code> ise token&#8217;lar\u0131n imzas\u0131n\u0131 do\u011frulamak i\u00e7in kullan\u0131lan public key&#8217;in ta kendisidir.<\/p>\n<p>Bu anahtar de\u011ferin nerede ve nas\u0131l kullan\u0131laca\u011f\u0131na i\u00e7eri\u011fimizin devam\u0131ndaki sat\u0131rlarda de\u011finiyor olaca\u011f\u0131z. \u015eimdi bizler yava\u015ftan konuyu pratik zemine kayd\u0131ral\u0131m ve authentication yap\u0131lanmas\u0131n\u0131 manuel olarak nas\u0131l ger\u00e7ekle\u015ftirebilece\u011fimize odaklanal\u0131m.<\/p>\n<h4><span class=\"ez-toc-section\" id=\"Manuel_Olarak_Tokeni_Validate_Edelim%E2%80%A6\"><\/span>Manuel Olarak Token&#8217;\u0131 Validate Edelim&#8230;<span class=\"ez-toc-section-end\"><\/span><\/h4>\n<p>\u0130lk olarak yapmam\u0131z gereken, manuel do\u011frulamay\u0131 ger\u00e7ekle\u015ftirecek olan s\u0131n\u0131f\u0131 <a href=\"https:\/\/www.nuget.org\/packages\/Microsoft.AspNetCore.Authentication.JwtBearer\" target=\"_blank\">Microsoft.AspNetCore.Authentication.JwtBearer<\/a> k\u00fct\u00fcphanesi e\u015fli\u011finde a\u015fa\u011f\u0131daki gibi tasarlamakt\u0131r:<\/p>\n<div style=\"font-size:12px;\">\n<pre class=\"brush: jscript; title: ; notranslate\" title=\"\">\r\n    public class ManualJwtValidator(IHttpClientFactory _httpClientFactory)\r\n    {\r\n        public async Task&lt;ClaimsPrincipal&gt; ValidateAsync(string token, string realm = &quot;master&quot;)\r\n        {\r\n            var httpClient = _httpClientFactory.CreateClient(&quot;keycloak&quot;);\r\n            var jwtSecurityTokenHandler = new JwtSecurityTokenHandler();\r\n\r\n            var tokenValidationParameters = new TokenValidationParameters\r\n            {\r\n                \/\/ Token'\u0131 kimin olu\u015fturdu\u011fu kontrol edilecek.\r\n                ValidateIssuer = true,\r\n                \/\/ Beklenen olu\u015fturucu adresi (Keycloak realm URL'i)\r\n                ValidIssuer = $&quot;{httpClient.BaseAddress.AbsoluteUri}realms\/{realm}&quot;,\r\n                \/\/ Token'\u0131n kime hitap etti\u011fi kontrol edilecek.\r\n                ValidateAudience = true,\r\n                \/\/ Beklenen hedef kitle.\r\n                ValidAudience = &quot;account&quot;,\r\n                \/\/ Token'\u0131n ge\u00e7erlilik s\u00fcresi kontrol edilecek.\r\n                ValidateLifetime = true,\r\n                \/\/ Token imzas\u0131n\u0131n do\u011frulu\u011funu kontrol edilecek.\r\n                ValidateIssuerSigningKey = true,\r\n                \/\/ Token imzas\u0131n\u0131 do\u011frulamak i\u00e7in public key'i al\u0131nmakta ve do\u011frulanmaktad\u0131r.\r\n                IssuerSigningKeyResolver = (token, securityToken, kid, validationParameters) =&gt;\r\n                {\r\n                    \/\/ Keycloak'tan JWKS endpoint'inden public key getirilmektedir.\r\n                    var publicKey = JWKSService.GetKeysAsync(httpClient, &quot;master&quot;).Result;\r\n                    return publicKey;\r\n                },\r\n                \/\/ JWT do\u011frulama i\u015flemi, claim'leri otomatik olarak 'Identity.Name' alan\u0131na e\u015flememektedir! Bu alan\u0131n hangi claim ile dolaca\u011f\u0131 bu property \u00fczerinden belirlenmelidir.\r\n                NameClaimType = JwtRegisteredClaimNames.PreferredUsername\r\n            };\r\n\r\n            var tokenValidationResult = await jwtSecurityTokenHandler.ValidateTokenAsync(token, tokenValidationParameters);\r\n            return new ClaimsPrincipal(tokenValidationResult.ClaimsIdentity);\r\n        }\r\n    }\r\n<\/pre>\n<\/div>\n<p>Burada, klasik Asp.NET Core \u00e7al\u0131\u015fmalar\u0131ndan a\u015fina olundu\u011fu \u00fczere bildi\u011finiz JWT do\u011frulama parametreleri yap\u0131land\u0131r\u0131lmaktad\u0131r. Gerekli a\u00e7\u0131klamalar\u0131 kod \u00fczerinde yapt\u0131\u011f\u0131mdan dolay\u0131 pek detaya girmeye l\u00fczum g\u00f6rmesem de <em>26.<\/em> sat\u0131ra dikkatinizi \u00e7ekmek istiyorum. Bu sat\u0131rda, i\u00e7eri\u011fi a\u015fa\u011f\u0131daki gibi taraf\u0131m\u0131zca olu\u015fturulmu\u015f <code>JWKSService.GetKeysAsync<\/code> metodu kullan\u0131lmaktad\u0131r:<\/p>\n<div style=\"font-size:12px;\">\n<pre class=\"brush: jscript; title: ; notranslate\" title=\"\">\r\n    public class JWKSService\r\n    {\r\n        public static async Task&lt;IList&lt;SecurityKey&gt;&gt; GetKeysAsync(HttpClient httpClient, string realm = &quot;master&quot;)\r\n        {\r\n            \/\/ Keycloak'un JWKS endpoint'inden public key'leri al\u0131yoruz.\r\n            var certsResponse = await httpClient.GetStringAsync($&quot;\/realms\/{realm}\/protocol\/openid-connect\/certs&quot;);\r\n            \/\/ JSON string'i JsonWebKeySet nesnesine d\u00f6n\u00fc\u015ft\u00fcr\u00fcyoruz. Bu, i\u00e7erisinde token'\u0131 do\u011frulamak i\u00e7in kullan\u0131lacak key'leri bar\u0131nd\u0131ran bir koleksiyondur.\r\n            var certsJWKS = new JsonWebKeySet(certsResponse);\r\n            \/\/ Key set'inden signed key'leri ay\u0131klay\u0131p, g\u00f6nderiyoruz.\r\n            var keys = certsJWKS.GetSigningKeys();\r\n            return keys;\r\n        }\r\n    }\r\n<\/pre>\n<\/div>\n<p>Bu metotta, token&#8217;\u0131 do\u011frulayabilmek i\u00e7in JWKS endpoint&#8217;inden elde edilen public key listesi elde edilmekte ve bu liste <code>IssuerSigningKeyResolver<\/code> property&#8217;sine sunulmaktad\u0131r. B\u00f6ylece do\u011frulama i\u00e7in gerekli olan t\u00fcm konfig\u00fcrasyonel de\u011ferler yap\u0131land\u0131rma s\u00fcrecinde uygun yerlere set edilmektedir. Art\u0131k, bu a\u015famadan sonra geriye token&#8217;\u0131 a\u015fa\u011f\u0131daki gibi do\u011frulamak kalmaktad\u0131r:<\/p>\n<div style=\"font-size:12px;\">\n<pre class=\"brush: jscript; title: ; notranslate\" title=\"\">\r\napp.MapGet(&quot;\/secure\/{realm}&quot;, async (ManualJwtValidator manualJwtValidator, &#x5B;FromHeader(Name = &quot;Authorization&quot;)] string authorization, string realm = &quot;master&quot;) =&gt;\r\n{\r\n    if (!authorization.StartsWith(&quot;Bearer &quot;))\r\n        return Results.Unauthorized();\r\n\r\n    var token = authorization.Substring(&quot;Bearer &quot;.Length);\r\n    var principal = await manualJwtValidator.ValidateAsync(token, realm);\r\n\r\n    return TypedResults.Ok(new\r\n    {\r\n        GivenName = principal.Claims.FirstOrDefault(claim =&gt; claim.Type == ClaimTypes.GivenName)?.Value,\r\n        UserName = principal.Identity?.Name,\r\n        Claims = principal.Claims.Select(c =&gt; new { c.Type, c.Value })\r\n    });\r\n});\r\n<\/pre>\n<\/div>\n<p><a href=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2026\/02\/Asp.NET-Core-Uygulamalarinda-Keycloak-Ile-Temel-Authentication-Islemleri-6-2.png\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2026\/02\/Asp.NET-Core-Uygulamalarinda-Keycloak-Ile-Temel-Authentication-Islemleri-6-2.png\" alt=\"Asp.NET Core Uygulamalar\u0131nda Keycloak \u0130le Temel Authentication \u0130\u015flemleri #6\" width=\"245\" height=\"274\" class=\"alignleft size-full wp-image-28393\" \/><\/a>Evet&#8230; Bu \u00e7al\u0131\u015fma neticesinde ilgili endpoint&#8217;e, <code>Authorization<\/code> header key&#8217;ine <em style=\"font-size:12px;\">Bearer {token}<\/em> \u015feklinde de\u011fer yerle\u015ftirilmi\u015f bir request at\u0131ld\u0131\u011f\u0131 taktirde do\u011frulama ger\u00e7ekle\u015ftirilecek ve netice yandaki g\u00f6rseldeki gibi elde edilecektir.<\/p>\n<p>Manuel do\u011frulamadan bu \u015fekilde yetinilebilir. Ancak bu \u00e7al\u0131\u015fmay\u0131 a\u015fa\u011f\u0131daki gibi custom middleware ile bir seviye daha profesyonelli\u011fe ta\u015f\u0131yarak, endpoint i\u00e7erisinde token ay\u0131klamas\u0131yla vs. u\u011fra\u015f\u0131lmayacak \u015fekilde yar\u0131 manuel hale getirebiliriz.<\/p>\n<h4><span class=\"ez-toc-section\" id=\"Yari_Manuel_Olarak_Tokeni_Validate_Edelim%E2%80%A6\"><\/span>Yar\u0131 Manuel Olarak Token&#8217;\u0131 Validate Edelim&#8230;<span class=\"ez-toc-section-end\"><\/span><\/h4>\n<div style=\"font-size:12px;\">\n<pre class=\"brush: jscript; title: ; notranslate\" title=\"\">\r\n    public class JwtAuthenticationMiddleware(IHttpClientFactory _httpClientFactory, ManualJwtValidator _manualJwtValidator) : IMiddleware\r\n    {\r\n        public async Task InvokeAsync(HttpContext context, RequestDelegate next)\r\n        {\r\n            var authorization = context.Request.Headers&#x5B;HeaderNames.Authorization].ToString();\r\n            if (authorization is not null)\r\n            {\r\n                var token = authorization.Substring(&quot;Bearer &quot;.Length);\r\n                var principal = await _manualJwtValidator.ValidateAsync(token);\r\n\r\n                context.User = principal;\r\n            }\r\n\r\n            await next(context);\r\n        }\r\n    }\r\n<\/pre>\n<\/div>\n<p>G\u00f6r\u00fcld\u00fc\u011f\u00fc \u00fczere, yukar\u0131daki gibi custom bir middleware sayesinde manuel authentication&#8217;\u0131 uygulamadaki t\u00fcm request&#8217;lere uygulayacak \u015fekilde geni\u015fletmi\u015f bulunuyoruz. Tabi bu middleware&#8217;in i\u015flevsel olabilmesi i\u00e7in mimariye a\u015fa\u011f\u0131daki gibi eklenmesi gerekmektedir.<\/p>\n<div style=\"font-size:12px;\">\n<pre class=\"brush: jscript; title: ; notranslate\" title=\"\">\r\napp.UseMiddleware&lt;JwtAuthenticationMiddleware&gt;();\r\n<\/pre>\n<\/div>\n<p>Art\u0131k bu a\u015famadan sonra gerisi testtir \ud83d\ude42 A\u015fa\u011f\u0131daki endpoint&#8217;e yine ayn\u0131 authorization header key&#8217;i e\u015fli\u011finde istekte bulunabilir ve kimlik do\u011frulama durumunu kontrol edebilirsiniz:<\/p>\n<div style=\"font-size:12px;\">\n<pre class=\"brush: jscript; title: ; notranslate\" title=\"\">\r\napp.MapGet(&quot;\/&quot;, (HttpContext httpContext) =&gt; httpContext.User.Identity?.IsAuthenticated);\r\n<\/pre>\n<\/div>\n<p>Tabi bu \u015fekilde manuel do\u011frulaman\u0131n getirdi\u011fi s\u0131k\u0131nt\u0131lar yok de\u011fil! \u015eimdi gelin bu s\u0131k\u0131nt\u0131lar\u0131 masaya yat\u0131r\u0131p fark\u0131ndal\u0131k olu\u015ftural\u0131m.<\/p>\n<h5><span class=\"ez-toc-section\" id=\"Manuel_Dogrulamanin_Getirdigi_Sikintilar\"><\/span>Manuel Do\u011frulaman\u0131n Getirdi\u011fi S\u0131k\u0131nt\u0131lar<span class=\"ez-toc-section-end\"><\/span><\/h5>\n<p>Manuel do\u011frulama s\u00fcrecinde, kullan\u0131c\u0131n\u0131n identity&#8217;sini ve sahip oldu\u011fu t\u00fcm bilgileri (claim&#8217;leri) temsil eden <code>ClaimsPrincipal<\/code> nesnesi \u00fcretiliyor, \u00fcretilmesine ama bu <code>HttpContext.User<\/code>&#8216;a tam olarak set edilmiyor! Dolay\u0131s\u0131yla bu durumda <code>[Authorize]<\/code>  do\u011fru d\u00fczg\u00fcn \u00e7al\u0131\u015fma sergileyemiyor! <em>Neden mi?<\/em> \u00c7\u00fcnk\u00fc, Asp.NET Core authentication pipeline&#8217;\u0131 tam \u00e7al\u0131\u015fm\u0131yor da ondan \ud83d\ude09 Yani Asp.NET Core, bu iste\u011fin hangi y\u00f6ntemle do\u011fruland\u0131\u011f\u0131n\u0131 bilmiyor, bu do\u011frulamay\u0131 kendi mekanizmas\u0131yla yapm\u0131\u015f saym\u0131yor ve t\u00fcm bu s\u00fcreci kendi authentication i\u015fleyi\u015finin bir par\u00e7as\u0131 olarak kabul etmiyor!<\/p>\n<p>Dolay\u0131s\u0131yla netice itibariyle bizler do\u011frulamay\u0131 her ne kadar ba\u015far\u0131l\u0131 yapm\u0131\u015f olursak olal\u0131m framework bu iste\u011fin authenticated oldu\u011funu bilmemektedir! Burada bizim, token&#8217;\u0131 do\u011frulaman\u0131n akabinde vaziyeti, Asp.NET Core&#8217;un authentication sistemine <em>-bu request, \u015fu AuthenticationScheme ile do\u011fruland\u0131-<\/em> \u015feklinde bildirmemiz gerekmektedir. \u00c7\u00fcnk\u00fc <code>[Authorize]<\/code> attribute&#8217;u, ilgili request&#8217;in, registered edilmi\u015f bir authentication scheme taraf\u0131ndan do\u011frulanm\u0131\u015f olup olmad\u0131\u011f\u0131na bakmaktad\u0131r&#8230; Ee bizler manuel do\u011frulamada, do\u011frulamay\u0131 ba\u015far\u0131l\u0131 ger\u00e7ekle\u015ftirmi\u015f olsak da herhangi bir authentication scheme ile bir bildirimde bulunmad\u0131\u011f\u0131m\u0131z i\u00e7in <code>[Authorize]<\/code> a\u00e7\u0131s\u0131ndan durum olumsuz de\u011ferlendirilecektir.<\/p>\n<blockquote><p><em>AuthenticationScheme, bir request geldi\u011finde hangi mekanizma ile kimlik do\u011frulamas\u0131 yap\u0131laca\u011f\u0131n\u0131n cevab\u0131n\u0131 verir&#8230; JWT mi, cookie mi, ba\u015fka bir mekanizma m\u0131&#8230;<\/em><\/p><\/blockquote>\n<p><em>AuthenticationScheme bu kadar \u015fart m\u0131?<\/em> diye sorarsan\u0131z, evet \u015fart&#8230; \u00c7\u00fcnk\u00fc Asp.NET Core&#8217;da ayn\u0131 anda birden fazla authentication y\u00f6ntemi desteklenebilmektedir ve o anda hangi y\u00f6ntemle do\u011frulama yap\u0131ld\u0131\u011f\u0131 sistem taraf\u0131ndan bilinmedi\u011fi s\u00fcrece mimarinin davran\u0131\u015f\u0131 \u015fekillenmemektedir.<\/p>\n<p>T\u00fcm bunlar\u0131n d\u0131\u015f\u0131nda, manuel do\u011frulama s\u00fcrecinde olas\u0131 red, yetkisizlik veya do\u011frulanamama durumlar\u0131nda sistem taraf\u0131ndan otomatik verilecek cevap t\u00fcrleri olan <code>Challenge<\/code> ve <code>Forbidden<\/code> tasarlanmad\u0131\u011f\u0131 i\u00e7in sistem kimin neden reddedildi\u011fini ay\u0131rt edememekte ve client&#8217;a do\u011fru ve standart bir bildirimde bulunamamaktad\u0131r.<\/p>\n<p>Toparlarsak e\u011fer; manuel token do\u011frulama, token&#8217;\u0131n ge\u00e7erli olup olmad\u0131\u011f\u0131n\u0131 anlamak i\u00e7in yeterlidir lakin Asp.NET Core&#8217;un <code>[Authorize]<\/code>, role, policy, 401\/403 ayr\u0131m\u0131 ve authentication lifecycle\u2019\u0131n\u0131 d\u00fczg\u00fcn \u00e7al\u0131\u015ft\u0131rabilmesi i\u00e7in de mutlaka bir AuthenticationScheme \u00fczerinden sisteme entegre edilmesi gerekmektedir. \u0130\u015fte bu nedenle kimlik do\u011frulama s\u00fcrecinde en do\u011fru, temiz ve Keycloak i\u00e7in de olduk\u00e7a uyumlu olan a\u015fa\u011f\u0131daki profesyonel yolu uygulamak gerekmektedir.<\/p>\n<h4><span class=\"ez-toc-section\" id=\"Profesyonel_Yol_%E2%80%93_AddAuthenticationAddJwtBearer\"><\/span>Profesyonel Yol \u2013 .AddAuthentication().AddJwtBearer()<span class=\"ez-toc-section-end\"><\/span><\/h4>\n<div style=\"border:1px solid #e1e4e8;background:#f6f8fa;padding:16px;border-radius:8px;font-family:Arial,Helvetica,sans-serif;font-size:14px;color:#24292e;word-break:break-all;\">\n  <strong style=\"display:block;margin-bottom:6px;color:#0969da;\">Gerekli K\u00fct\u00fcphaneler<\/strong><br \/>\n<a href=\"https:\/\/www.nuget.org\/packages\/Microsoft.AspNetCore.Authentication.JwtBearer\" target=\"_blank\">Microsoft.AspNetCore.Authentication.JwtBearer<\/a>\n<\/div>\n<p>Profesyonel seviyede authentication yap\u0131land\u0131rmas\u0131nda bulunabilmek i\u00e7in Asp.NET Core mimarisine a\u015fa\u011f\u0131daki gibi <code>AddAuthentication<\/code> ve <code>AddJwtBearer<\/code> yap\u0131land\u0131rmalar\u0131n\u0131n bulunulmas\u0131 yeterlidir:<\/p>\n<div style=\"font-size:12px;\">\n<pre class=\"brush: jscript; title: ; notranslate\" title=\"\">\r\n\/\/ Authentication mekanizmas\u0131n\u0131n JWT Bearer olaca\u011f\u0131n\u0131 belirtiyoruz.\r\nbuilder.Services.AddAuthentication(JwtBearerDefaults.AuthenticationScheme)\r\n                \/\/ JWT Bearer token'lar\u0131n\u0131 i\u015fleyecek ve do\u011frulayacak handler'\u0131 yap\u0131land\u0131r\u0131yoruz.\r\n                .AddJwtBearer(options =&gt;\r\n                {\r\n                    \/\/ Token'\u0131 do\u011frulayacak otorite (Keycloak server) adresini belirtiyoruz. Public key, ilgili k\u00fct\u00fcphane taraf\u0131ndan bu otoritenin certs adresinden otomatik al\u0131nacakt\u0131r.\r\n                    options.Authority = &quot;http:\/\/127.0.0.1:8080\/realms\/master&quot;;\r\n\r\n                    options.Audience = &quot;account&quot;;\r\n\r\n                    options.RequireHttpsMetadata = false;\r\n\r\n                    options.TokenValidationParameters = new TokenValidationParameters\r\n                    {\r\n                        ValidateIssuer = true,\r\n                        ValidateAudience = true,\r\n                        ValidateLifetime = true,\r\n                        ValidateIssuerSigningKey = true,\r\n                        NameClaimType = JwtRegisteredClaimNames.PreferredUsername\r\n                    };\r\n                });\r\n<\/pre>\n<\/div>\n<p>Burada dikkatinizi direkt, issuer tan\u0131mlamas\u0131 ile birlikte public key \u00e7al\u0131\u015fmas\u0131n\u0131n olmay\u0131\u015f\u0131na \u00e7ekmek isterim. Evet, profesyonel yol olarak isimlendirdi\u011fimiz bu yakla\u015f\u0131mda issuer ve public key tan\u0131mlamalar\u0131n\u0131 manuel yapmam\u0131za gerek bulunmamaktad\u0131r. Bunun nedeni <code>AddJwtBearer<\/code> servisinde tan\u0131mlad\u0131\u011f\u0131m\u0131z <code>Authority<\/code> yap\u0131land\u0131rmas\u0131d\u0131r. Bu yap\u0131land\u0131rma sayesinde Asp.NET Core, <a href=\"https:\/\/www.gencayyildiz.com\/blog\/tag\/well-known\/\" target=\"_blank\">.well-known<\/a> endpoint&#8217;ine otomatik bir \u015fekilde istekte bulunarak hem issuer hem de public key bilgilerine eri\u015fmekte ve yap\u0131land\u0131rmaya kendi dahil etmektedir.<\/p>\n<p>Yap\u0131land\u0131rmay\u0131 bu \u015fekilde tasarlad\u0131ktan sonra mimarinin pipeline&#8217;\u0131na a\u015fa\u011f\u0131daki middleware&#8217;in eklenmesi gerekmektedir:<\/p>\n<div style=\"font-size:12px;\">\n<pre class=\"brush: jscript; title: ; notranslate\" title=\"\">\r\napp.UseAuthentication();\r\n<\/pre>\n<\/div>\n<p>B\u00f6ylece gelen request&#8217;teki token&#8217;\u0131 okuyup, yapt\u0131\u011f\u0131m\u0131z yap\u0131land\u0131rma kurallar\u0131 \u00e7er\u00e7evesinde kullan\u0131c\u0131 do\u011frulanmaya \u00e7al\u0131\u015f\u0131lacakt\u0131r.<\/p>\n<p>Evet, b\u00f6ylece Keycloak&#8217;da do\u011frulamay\u0131 daha profesyonel ve olmas\u0131 gereken ideal haliyle ger\u00e7ekle\u015ftirmi\u015f bulunmaktay\u0131z. Bu y\u00f6ntemle; Keycloak JWKS bilgileri otomatik edinilmekte, key rotation desteklenmekte, token cache edilebilmekte, 401 \/ 403 y\u00f6nlendirmeleri otomatik olarak y\u00f6netilebilmekte ve t\u00fcm bu yap\u0131land\u0131rmalar Asp.NET Core security pipeline&#8217;\u0131na standart bir \u015fekilde entegre olarak ger\u00e7ekle\u015ftirilmektedir \ud83d\ude42<\/p>\n<p>\u0130\u015fte bu kadar basit \ud83d\ude42<\/p>\n<p>Bundan sonraki i\u00e7eriklerimizde art\u0131k bu bilgi zeminini kullanarak ilerleyecek ve ak\u0131\u015flar\u0131, bunlar\u0131n bilindi\u011fi varsay\u0131mla inceliyor olaca\u011f\u0131z.<\/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<div style=\"max-width:720px;margin:24px auto;padding:18px 20px;border-radius:12px;background:linear-gradient(135deg,#0d1117,#161b22);border:1px solid #30363d;font-family:-apple-system,BlinkMacSystemFont,'Segoe UI',Roboto,Arial,sans-serif;color:#e6edf3;box-shadow:0 10px 30px rgba(0,0,0,.35);\">\n<div style=\"display:flex;align-items:center;gap:14px;margin-bottom:12px;\">\n    <svg style=\"width:34px;height:34px;fill:#58a6ff;flex-shrink:0;\" viewBox=\"0 0 16 16\" aria-hidden=\"true\">\n      <path d=\"M8 0C3.58 0 0 3.58 0 8c0 3.54 2.29 6.53 5.47 7.59.4.07.55-.17.55-.38 0-.19-.01-.82-.01-1.49-2.01.37-2.53-.49-2.69-.94-.09-.23-.48-.94-.82-1.13-.28-.15-.68-.52-.01-.53.63-.01 1.08.58 1.23.82.72 1.21 1.87.87 2.33.66.07-.52.28-.87.51-1.07-1.78-.2-3.64-.89-3.64-3.95 0-.87.31-1.59.82-2.15-.08-.2-.36-1.02.08-2.12 0 0 .67-.21 2.2.82a7.65 7.65 0 012-.27c.68 0 1.36.09 2 .27 1.53-1.04 2.2-.82 2.2-.82.44 1.1.16 1.92.08 2.12.51.56.82 1.27.82 2.15 0 3.07-1.87 3.75-3.65 3.95.29.25.54.73.54 1.48 0 1.07-.01 1.93-.01 2.2 0 .21.15.46.55.38A8.013 8.013 0 0016 8c0-4.42-3.58-8-8-8z\"><\/path>\n    <\/svg><\/p>\n<div>\n<div style=\"font-size:18px;font-weight:600;line-height:1.2;\">\u00d6rnek \u00e7al\u0131\u015fmaya a\u015fa\u011f\u0131daki GitHub reposundan eri\u015febilirsiniz.<\/div>\n<div style=\"font-size:13px;color:#8b949e;\">https:\/\/github.com\/gncyyldz\/Keycloak.Examples<\/div>\n<\/p><\/div>\n<\/p><\/div>\n<div style=\"font-size:14px;line-height:1.6;color:#c9d1d9;margin-bottom:14px;\">\n    Bu repository, ilgili projenin kaynak kodlar\u0131n\u0131 ve mimari yap\u0131s\u0131n\u0131 i\u00e7ermektedir. Detaylar i\u00e7in GitHub \u00fczerinden inceleyebilirsiniz.\n  <\/div>\n<p>  <a href=\"https:\/\/github.com\/gncyyldz\/Keycloak.Examples\/tree\/Keycloak3.AspNETCore-Uygulamalar%C4%B1nda-Keycloak-%C4%B0le-Temel-Authentication-%C4%B0%C5%9Flemleri\" target=\"_blank\" rel=\"noopener noreferrer\"\n     style=\"display:inline-block;padding:10px 16px;border-radius:8px;background:#238636;color:#ffffff;text-decoration:none;font-size:14px;font-weight:600;transition:all .2s ease;\"><br \/>\n    GitHub\u2019da G\u00f6r\u00fcnt\u00fcle \u2192<br \/>\n  <\/a><\/p>\n<\/div>\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, Bu i\u00e7eri\u011fimizde Keycloak&#8217;da en temel seviyede authentication i\u015flemlerini ele alacak ve \u00fcretilmi\u015f bir token&#8217;\u0131n hem manuel hem de .AddAuthentication() middleware&#8217;i ile profesyonel do\u011frulamalar\u0131n\u0131n nas\u0131l yap\u0131laca\u011f\u0131n\u0131 de\u011ferlendiriyor olaca\u011f\u0131z. Tabi t\u00fcm bu \u00e7al\u0131\u015fma boyunca s\u00fcrece&#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":28235,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[5206,3102,5554],"tags":[2679,5632,2759,5640,3066,5641,5639,5638,5555,5558,5637,5636,5635,5634,5633],"class_list":["post-28379","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-net","category-asp-net-core","category-keycloak","tag-asp-net-core","tag-asp-net-core-keycloak","tag-authentication","tag-challenge","tag-claimsprincipal","tag-forbidden","tag-json-web-key-set","tag-jwks","tag-keycloak","tag-keycloak-authentication","tag-private-key","tag-public-key","tag-rs256","tag-rsa-oaep","tag-stateless-authenticaiton"],"amp_enabled":true,"_links":{"self":[{"href":"https:\/\/www.gencayyildiz.com\/blog\/wp-json\/wp\/v2\/posts\/28379","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=28379"}],"version-history":[{"count":15,"href":"https:\/\/www.gencayyildiz.com\/blog\/wp-json\/wp\/v2\/posts\/28379\/revisions"}],"predecessor-version":[{"id":28403,"href":"https:\/\/www.gencayyildiz.com\/blog\/wp-json\/wp\/v2\/posts\/28379\/revisions\/28403"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.gencayyildiz.com\/blog\/wp-json\/wp\/v2\/media\/28235"}],"wp:attachment":[{"href":"https:\/\/www.gencayyildiz.com\/blog\/wp-json\/wp\/v2\/media?parent=28379"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.gencayyildiz.com\/blog\/wp-json\/wp\/v2\/categories?post=28379"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.gencayyildiz.com\/blog\/wp-json\/wp\/v2\/tags?post=28379"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}