﻿
{"id":28434,"date":"2026-02-16T11:54:12","date_gmt":"2026-02-16T11:54:12","guid":{"rendered":"https:\/\/www.gencayyildiz.com\/blog\/?p=28434"},"modified":"2026-02-18T08:46:16","modified_gmt":"2026-02-18T08:46:16","slug":"keycloak-asp-net-core-ile-direct-grant-flow-authentication-8","status":"publish","type":"post","link":"https:\/\/www.gencayyildiz.com\/blog\/keycloak-asp-net-core-ile-direct-grant-flow-authentication-8\/","title":{"rendered":"Keycloak | Asp.NET Core \u0130le Direct Grant Flow Authentication #8"},"content":{"rendered":"<div id=\"fb-root\"><\/div>\n<p>Merhaba,<br \/>\n<div id=\"ez-toc-container\" class=\"ez-toc-v2_0_80 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-3'><a class=\"ez-toc-link ez-toc-heading-1\" href=\"https:\/\/www.gencayyildiz.com\/blog\/keycloak-asp-net-core-ile-direct-grant-flow-authentication-8\/#Direct_Grant_Flow_Nasil_Bir_Davranisa_Sahiptir\" >Direct Grant Flow Nas\u0131l Bir Davran\u0131\u015fa Sahiptir?<\/a><ul class='ez-toc-list-level-5' ><li class='ez-toc-heading-level-5'><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\/keycloak-asp-net-core-ile-direct-grant-flow-authentication-8\/#Hangi_DurumlarSenaryolar_Icin_Tasarlanmistir\" >Hangi Durumlar\/Senaryolar \u0130\u00e7in Tasarlanm\u0131\u015ft\u0131r?<\/a><\/li><\/ul><\/li><\/ul><\/li><li class='ez-toc-page-1 ez-toc-heading-level-3'><a class=\"ez-toc-link ez-toc-heading-3\" href=\"https:\/\/www.gencayyildiz.com\/blog\/keycloak-asp-net-core-ile-direct-grant-flow-authentication-8\/#Direct_Grant_Flowun_Ic_Yapisi\" >Direct Grant Flow&#8217;un \u0130\u00e7 Yap\u0131s\u0131<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-3'><a class=\"ez-toc-link ez-toc-heading-4\" href=\"https:\/\/www.gencayyildiz.com\/blog\/keycloak-asp-net-core-ile-direct-grant-flow-authentication-8\/#Direct_Grant_Flowda_Dikkat_Edilmesi_Gereken_Durumlar\" >Direct Grant Flow&#8217;da Dikkat Edilmesi Gereken Durumlar<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-3'><a class=\"ez-toc-link ez-toc-heading-5\" href=\"https:\/\/www.gencayyildiz.com\/blog\/keycloak-asp-net-core-ile-direct-grant-flow-authentication-8\/#12_Kritik_Soru_12_Kritik_Cevap\" >12 Kritik Soru \/ 12 Kritik Cevap<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-3'><a class=\"ez-toc-link ez-toc-heading-6\" href=\"https:\/\/www.gencayyildiz.com\/blog\/keycloak-asp-net-core-ile-direct-grant-flow-authentication-8\/#AspNET_Core_Ile_Direct_Grant_Flow_Calismasi\" >Asp.NET Core \u0130le Direct Grant Flow \u00c7al\u0131\u015fmas\u0131<\/a><ul class='ez-toc-list-level-5' ><li class='ez-toc-heading-level-5'><ul class='ez-toc-list-level-5' ><li class='ez-toc-heading-level-5'><a class=\"ez-toc-link ez-toc-heading-7\" href=\"https:\/\/www.gencayyildiz.com\/blog\/keycloak-asp-net-core-ile-direct-grant-flow-authentication-8\/#Token_Ile_APIyi_Koruyalim%E2%80%A6\" >Token \u0130le API&#8217;yi Koruyal\u0131m&#8230;<\/a><\/li><\/ul><\/li><\/ul><\/li><\/ul><\/nav><\/div>\n<br \/>\nBu i\u00e7eri\u011fimizde kullan\u0131c\u0131y\u0131 login ekran\u0131na hi\u00e7 y\u00f6nlendirmeksizin, uygulama arac\u0131l\u0131\u011f\u0131yla username + password&#8217;\u00fc do\u011frudan Keycloak&#8217;a g\u00f6nderip access token al\u0131nmas\u0131n\u0131 sa\u011flayacak olan Direct Grant Flow davran\u0131\u015f\u0131n\u0131 mercek alt\u0131na al\u0131yor olaca\u011f\u0131z.<\/p>\n<h3><span class=\"ez-toc-section\" id=\"Direct_Grant_Flow_Nasil_Bir_Davranisa_Sahiptir\"><\/span>Direct Grant Flow Nas\u0131l Bir Davran\u0131\u015fa Sahiptir?<span class=\"ez-toc-section-end\"><\/span><\/h3>\n<blockquote style=\"font-size:13px;\"><p><em>Direct Grant Flow&#8217;da browser yoktur, redirect yoktur, HTML form yoktur&#8230; Tamamen arka planda programatik olarak \u00e7al\u0131\u015fan bir kimlik do\u011frulama \u015feklidir&#8230;<\/em><\/p><\/blockquote>\n<p>Direct Grant Flow&#8217;da uygulama Keycloak&#8217;a arka plandan programatik olarak username &#038; password bilgilerini g\u00f6nderir, Keycloak ise bu bilgileri do\u011frulayarak token \u00fcretir. B\u00f6ylece kullan\u0131c\u0131y\u0131 Keycloak&#8217;a y\u00f6nlendirmeksizin s\u0131f\u0131r etkile\u015fimle token al\u0131nmas\u0131n\u0131 sa\u011flar. Bu i\u015flem, <em><strong>OAuth2 Resource Owner Password Credentials Grant<\/strong><\/em>&#8216;in Keycloak taraf\u0131ndaki kar\u015f\u0131l\u0131\u011f\u0131d\u0131r.<\/p>\n<h5><span class=\"ez-toc-section\" id=\"Hangi_DurumlarSenaryolar_Icin_Tasarlanmistir\"><\/span>Hangi Durumlar\/Senaryolar \u0130\u00e7in Tasarlanm\u0131\u015ft\u0131r?<span class=\"ez-toc-section-end\"><\/span><\/h5>\n<p>Direct grant flow, \u00f6zellikle backend a\u011f\u0131rl\u0131kl\u0131 \u00e7al\u0131\u015fmalar i\u00e7in olduk\u00e7a kullan\u0131\u015fl\u0131d\u0131r. Misal olarak; eski CLI ara\u00e7lar\u0131, script&#8217;ler, cron job&#8217;lar da bir login olma ihtiyac\u0131 varsa s\u00fcreci daha da komplike etmemek i\u00e7in bu ak\u0131\u015ftan istifade edilebilir ve kullan\u0131c\u0131 ad\u0131 ve \u015fifre odakl\u0131 \u00e7al\u0131\u015fma h\u0131zl\u0131ca sa\u011flanarak gerekli yetkilendirme ger\u00e7ekle\u015ftirilebilir. Ayr\u0131ca taray\u0131c\u0131n\u0131n kullan\u0131lamayaca\u011f\u0131 mobil veya desktop uygulamalarda login olunmas\u0131 gerekiyorsa e\u011fer yine bu ak\u0131\u015ftan istifade edilebilir yahut m\u00fcdahale ihtimali d\u00fc\u015f\u00fck olan legacy sistemlerde de login ihtiyac\u0131n\u0131 giderebilmek i\u00e7in de tercih edilebilir. Tabi bu ve bunlara benzer durumlar\u0131 saymakla bitiremesek de k\u0131saca a\u015fa\u011f\u0131daki gibi \u00f6zetleyebilir ve genel bir tan\u0131mda bulunabiliriz&#8230;<\/p>\n<table style=\"width:100%;border-collapse:collapse;font-family:Arial,Helvetica,sans-serif;font-size:14px;background-color:#ffffff;border:1px solid #e5e7eb;table-layout:fixed;\">\n<thead>\n<tr>\n<th style=\"width:30%;padding:12px 15px;border:1px solid #e5e7eb;background-color:#0f172a;color:#ffffff;text-align:left;font-weight:600;\">Durum<\/th>\n<th style=\"width:50%;padding:12px 15px;border:1px solid #e5e7eb;background-color:#0f172a;color:#ffffff;text-align:left;font-weight:600;\">Nedeni?<\/th>\n<th style=\"width:20%;padding:0;border:1px solid #e5e7eb;background-color:#0f172a;color:#ffffff;height:80px;\">\n<div style=\"display:flex;flex-direction:column;height:100%;\">\n<div style=\"flex:1;display:flex;align-items:center;justify-content:center;border-bottom:1px solid #334155;font-weight:600;\">\u00d6neriliyor mu?<\/div>\n<div style=\"flex:1;display:flex;align-items:center;justify-content:center;font-weight:600;\">Alternatifi var m\u0131?<\/div>\n<\/p><\/div>\n<\/th>\n<\/tr>\n<\/thead>\n<tbody>\n<tr>\n<td style=\"width:30%;padding:12px 15px;border:1px solid #e5e7eb;text-align:justify;vertical-align:top;\">Eski CLI ara\u00e7lar\u0131, script&#8217;ler, cron job&#8217;lar<\/td>\n<td style=\"width:50%;padding:12px 15px;border:1px solid #e5e7eb;text-align:justify;vertical-align:top;\">\u00c7\u00fcnk\u00fc bu tarz eski sistemlerde token almak i\u00e7in yap\u0131lacak \u00e7al\u0131\u015fmalar a\u015f\u0131r\u0131 derecede dallan\u0131p budaklanabilir ve zaten muhtemelen karma\u015f\u0131k olan yap\u0131 daha da arap sa\u00e7\u0131na d\u00f6nerek geli\u015ftiricileri zorlayabilir. O y\u00fczden kullan\u0131c\u0131 ad\u0131 ve \u015fifre ile token almak en basit ve ideal \u00e7\u00f6z\u00fcm olacakt\u0131r.<\/td>\n<td style=\"width:20%;padding:0;border:1px solid #e5e7eb;height:110px;\">\n<div style=\"display:flex;flex-direction:column;height:100%;\">\n<div style=\"flex:1;display:flex;align-items:flex-end;justify-content:center;border-bottom:1px solid #e5e7eb;padding-bottom:6px;\">\n            <span style=\"font-size:12px;color:#16a34a;\">\u2714<\/span>\n          <\/div>\n<div style=\"flex:1;display:flex;align-items:flex-start;justify-content:center;padding-top:6px;\">\n            <span style=\"font-size:12px;color:#dc2626;\">\u2716<\/span>\n          <\/div>\n<\/p><\/div>\n<\/td>\n<\/tr>\n<tr>\n<td style=\"width:30%;padding:12px 15px;border:1px solid #e5e7eb;text-align:justify;vertical-align:top;\">Kurumsal i\u00e7 a\u011fda, g\u00fcvenilir mobil\/desktop uygulamalar<\/td>\n<td style=\"width:50%;padding:12px 15px;border:1px solid #e5e7eb;text-align:justify;vertical-align:top;\">Kurumsal i\u00e7 a\u011flarda genellikle uygulamalar geli\u015ftiricilerin kontrol\u00fcnde olurlar ve credentials&#8217;\u0131n \u00e7al\u0131\u015fmayaca\u011f\u0131na dair bir g\u00fcven s\u00f6z konusu olur.<\/td>\n<td style=\"width:20%;padding:0;border:1px solid #e5e7eb;height:110px;\">\n<div style=\"display:flex;flex-direction:column;height:100%;\">\n<div style=\"flex:1;display:flex;align-items:flex-end;justify-content:center;border-bottom:1px solid #e5e7eb;padding-bottom:6px;\">\n            <span style=\"font-size:12px;color:#16a34a;\">\u2714<\/span>\n          <\/div>\n<div style=\"flex:1;display:flex;align-items:flex-start;justify-content:center;padding-top:6px;\">\n            <span style=\"font-size:12px;color:#dc2626;\">\u2716<\/span>\n          <\/div>\n<\/p><\/div>\n<\/td>\n<\/tr>\n<tr>\n<td style=\"width:30%;padding:12px 15px;border:1px solid #e5e7eb;text-align:justify;vertical-align:top;\">Legacy sistem entegrasyonu<\/td>\n<td style=\"width:50%;padding:12px 15px;border:1px solid #e5e7eb;text-align:justify;vertical-align:top;\">Eski sistemler genellikle ba\u015fka bir ak\u0131\u015f bilmezler ya da farkl\u0131 bir ak\u0131\u015fa y\u00fcksek diren\u00e7 g\u00f6sterebilirler.<\/td>\n<td style=\"width:20%;padding:0;border:1px solid #e5e7eb;height:110px;\">\n<div style=\"display:flex;flex-direction:column;height:100%;\">\n<div style=\"flex:1;display:flex;align-items:flex-end;justify-content:center;border-bottom:1px solid #e5e7eb;padding-bottom:6px;\">\n            <span style=\"font-size:12px;color:#16a34a;\">\u2714<\/span>\n          <\/div>\n<div style=\"flex:1;display:flex;align-items:flex-start;justify-content:center;padding-top:6px;\">\n            <span style=\"font-size:12px;color:#dc2626;\">\u2716<\/span>\n          <\/div>\n<\/p><\/div>\n<\/td>\n<\/tr>\n<tr>\n<td style=\"width:30%;padding:12px 15px;border:1px solid #e5e7eb;text-align:justify;vertical-align:top;\">Testing \/ development ortamlar\u0131<\/td>\n<td style=\"width:50%;padding:12px 15px;border:1px solid #e5e7eb;text-align:justify;vertical-align:top;\">Bu ortamlarda ama\u00e7 genellikle business logic kontrol\u00fcn\u00fc sa\u011flamak oldu\u011fundan login s\u00fcre\u00e7lerindeki ak\u0131\u015f maliyetlerinden ka\u00e7\u0131nmak i\u00e7in kullan\u0131labilir.<\/td>\n<td style=\"width:20%;padding:0;border:1px solid #e5e7eb;height:110px;\">\n<div style=\"display:flex;flex-direction:column;height:100%;\">\n<div style=\"flex:1;display:flex;align-items:flex-end;justify-content:center;border-bottom:1px solid #e5e7eb;padding-bottom:6px;\">\n            <span style=\"font-size:12px;color:#16a34a;\">\u2714<\/span>\n          <\/div>\n<div style=\"flex:1;display:flex;align-items:flex-start;justify-content:center;padding-top:6px;\">\n            <span style=\"font-size:10px;color:#dc2626;line-height: 1.3;\">\u0130stenirse bu ortamlarda da geli\u015ftirme sa\u011flanabilir, ancak gereksiz ve yersiz bir maliyet yarataca\u011f\u0131 i\u00e7in \u00f6nerilmez!<\/span>\n          <\/div>\n<\/p><\/div>\n<\/td>\n<\/tr>\n<tr>\n<td style=\"width:30%;padding:12px 15px;border:1px solid #e5e7eb;text-align:justify;vertical-align:top;\">\u00d6zel uygulama login ekranlar\u0131<\/td>\n<td style=\"width:50%;padding:12px 15px;border:1px solid #e5e7eb;text-align:justify;vertical-align:top;\">Kimi uygulamalarda login ekranlar\u0131 uygulamaya \u00f6zel olarak tasarlanmakta ve Keycloak&#8217;\u0131n login UI&#8217;\u0131 hi\u00e7 kullan\u0131lmamaktad\u0131r. B\u00f6yle durumlarda bu ak\u0131\u015f olduk\u00e7a etkili \u00e7\u00f6z\u00fcm sa\u011fl\u0131yor olacakt\u0131r.<\/td>\n<td style=\"width:20%;padding:0;border:1px solid #e5e7eb;height:110px;\">\n<div style=\"display:flex;flex-direction:column;height:100%;\">\n<div style=\"flex:1;display:flex;align-items:flex-end;justify-content:center;border-bottom:1px solid #e5e7eb;padding-bottom:6px;\">\n            <span style=\"font-size:12px;color:#16a34a;\">\u2714<\/span>\n          <\/div>\n<div style=\"flex:1;display:flex;align-items:flex-start;justify-content:center;padding-top:6px;\">\n            <span style=\"font-size:10px;color:#dc2626;line-height: 1.3;\">\u2716<\/span>\n          <\/div>\n<\/p><\/div>\n<\/td>\n<\/tr>\n<tr>\n<td style=\"width:30%;padding:12px 15px;border:1px solid #e5e7eb;text-align:justify;vertical-align:top;\">Microservice \/ sistemden sisteme kullan\u0131c\u0131 do\u011frulama<\/td>\n<td style=\"width:50%;padding:12px 15px;border:1px solid #e5e7eb;text-align:justify;vertical-align:top;\">Bir servis browser ak\u0131\u015f\u0131 olmaks\u0131z\u0131n kullan\u0131c\u0131 ad\u0131na i\u015flem yapacaksa e\u011fer tercih edilebilir.<\/td>\n<td style=\"width:20%;padding:0;border:1px solid #e5e7eb;height:110px;\">\n<div style=\"display:flex;flex-direction:column;height:100%;\">\n<div style=\"flex:1;display:flex;align-items:flex-end;justify-content:center;border-bottom:1px solid #e5e7eb;padding-bottom:6px;\">\n            <span style=\"font-size:12px;color:#16a34a;\">Pek de\u011fil!<\/span>\n          <\/div>\n<div style=\"flex:1;display:flex;align-items:flex-start;justify-content:center;padding-top:6px;\">\n            <span style=\"font-size:10px;color:#dc2626;line-height: 1.3;\">Client Credentials Flow<\/span>\n          <\/div>\n<\/p><\/div>\n<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<p><strong><em>Peki hangi durumlarda tercih edilmemelidir?<\/em><\/strong><br \/>\nDirect grant flow, \u00f6zellikle public olan yaz\u0131l\u0131mlarda tercih edilmemelidir. Misal olarak; 3. taraf mobil uygulamalarda bu flow&#8217;u kullanmak credentials&#8217;\u0131n uygulama i\u00e7inde saklanmas\u0131ndan dolay\u0131 \u00e7ok tehlikelidir.<\/p>\n<p>Ayr\u0131ca modern SPA + backend uygulamalarda Authorization Code Flow + PKCE ve machine-to-machine \u00e7al\u0131\u015fmalar\u0131nda ise Client Credentials Flow yakla\u015f\u0131mlar\u0131 \u00e7ok daha g\u00fcvenli olaca\u011f\u0131ndan dolay\u0131 bu tarz senaryolarda da \u00f6nerilmemektedir.<\/p>\n<p>IoT cihazlar\u0131 sorarsan\u0131z e\u011fer bu tarz durumlarda da cihaz ak\u0131\u015flar\u0131 s\u00f6z konusu olaca\u011f\u0131ndan <em>Device Authorization Grant<\/em> tercih edilmelidir.<\/p>\n<p>Yani anlayaca\u011f\u0131n\u0131z browser tabanl\u0131 web uygulamalar\u0131nda, SSO beklentisi olan sistemlerde, MFA \/ OTP gibi geli\u015fmi\u015f auth gerektiren senaryolarda ve g\u00fcvenli\u011fi \u00f6ncelik olan modern uygulamalarda direct grant flow kullan\u0131lmamal\u0131d\u0131r!<\/p>\n<blockquote><p><em>Direct Grant Flow&#8217;da, kimlik av\u0131 (phishing) ve kimlik bilgilerinin s\u0131zd\u0131r\u0131lmas\u0131 (credential leakage) riski her daim s\u00f6z konusudur! O y\u00fczden dikkatli kullan\u0131lmal\u0131d\u0131r.<\/em><\/p><\/blockquote>\n<h3><span class=\"ez-toc-section\" id=\"Direct_Grant_Flowun_Ic_Yapisi\"><\/span>Direct Grant Flow&#8217;un \u0130\u00e7 Yap\u0131s\u0131<span class=\"ez-toc-section-end\"><\/span><\/h3>\n<p>Direct grant flow&#8217;un i\u00e7 yap\u0131s\u0131 a\u015fa\u011f\u0131daki gibidir. <\/p>\n<div style=\"background:#0d0d0d;color:#e6e6e6;font-family:Consolas,'Courier New',monospace;font-size:16px;white-space:pre;line-height:0.8;padding:12px;width:410px;\">\nDirect Grant<br \/>\n\u251c\u2500\u2500 Username Validation (execution)<br \/>\n\u251c\u2500\u2500 Password (execution)<br \/>\n\u251c\u2500\u2500 Direct Grant &#8211; Conditional OTP (sub-flow)<br \/>\n\u2502   \u251c\u2500\u2500 Condition &#8211; user configured (condition)<br \/>\n\u2502   \u2514\u2500\u2500 OTP (step)\n<\/div>\n<p>Burada g\u00f6r\u00fcld\u00fc\u011f\u00fc \u00fczere, direct grant flow&#8217;un ak\u0131\u015f mant\u0131\u011f\u0131 olduk\u00e7a sadedir&#8230; Keycloak&#8217;un <code>\/token<\/code> endpoint&#8217;ine direct grant flow t\u00fcr\u00fcnden bir istek geldi\u011fi taktirde bu ak\u0131\u015f\u0131n her bir ad\u0131m\u0131 \u015fu sorumluluklar\u0131 yerine getiriyor olacakt\u0131r:<\/p>\n<ul style=\"font-size:14px;\">\n<li>1\ufe0f\u20e3<strong><em>Username Validation<\/em><\/strong><br \/>\nGelen istekte username de\u011ferini alacak, realm i\u00e7erisinde ilgili kullan\u0131c\u0131y\u0131 arayacak ve ard\u0131ndan bu kullan\u0131c\u0131da \u015funlar\u0131 kontrol edecektir:<br \/>\n\ud83e\udc12 Kullan\u0131c\u0131 var m\u0131?<br \/>\n\ud83e\udc12 Enabled m\u0131?<br \/>\nE\u011fer ba\u015far\u0131s\u0131z olursa ak\u0131\u015f <em>HTTP 400<\/em> e\u015fli\u011finde <em>invalid_grant<\/em> d\u00f6necektir. Yok e\u011fer ba\u015far\u0131l\u0131 olursa da user context olu\u015fturulacak ve bir sonraki ad\u0131ma ge\u00e7ilecektir.\n<\/li>\n<li>2\ufe0f\u20e3<strong><em>Password<\/em><\/strong><br \/>\nGelen istekten password de\u011feri al\u0131nacak ve kullan\u0131c\u0131n\u0131n stored credential hash&#8217;i ile kar\u015f\u0131la\u015ft\u0131r\u0131lacakt\u0131r. E\u011fer kar\u015f\u0131la\u015ft\u0131rma ger\u00e7ekle\u015ftirilemiyorsa yine <em>invalid_grant<\/em> d\u00f6necek ve ak\u0131\u015f\u0131 sonland\u0131racakt\u0131r. Yok e\u011fer kar\u015f\u0131la\u015ft\u0131rma ba\u015far\u0131l\u0131ysa kullan\u0131c\u0131 authenticate edilmi\u015f say\u0131lacak <u>(ama hen\u00fcz token \u00fcretilmeyecek!)<\/u> ve bir sonraki ad\u0131ma ge\u00e7ilecektir.\n<\/li>\n<li>3\ufe0f\u20e3<strong><em>Direct Grant &#8211; Conditional OTP<\/em><\/strong><br \/>\nBu ad\u0131m esas\u0131nda bir sub flow&#8217;dur ve a\u015fa\u011f\u0131daki b\u00f6l\u00fcmlerden olu\u015fmaktad\u0131r:<\/p>\n<ul>\n<li>3\ufe0f\u20e3.1\ufe0f\u20e3<strong><em>Condition \u2013 user configured<\/em><\/strong><br \/>\nBu ad\u0131mdan da anla\u015f\u0131laca\u011f\u0131 \u00fczere bir condition execution&#8217;d\u0131r ve ilgili kullan\u0131c\u0131da OTP credential&#8217;\u0131n tan\u0131ml\u0131 olup olmad\u0131\u011f\u0131n\u0131 kontrol etmektedir.<\/p>\n<p>E\u011fer ki OTP yap\u0131land\u0131r\u0131lmam\u0131\u015fsa i\u00e7inde bulunulan sub flow tamamen atlanacakt\u0131r. Yok e\u011fer bir yap\u0131land\u0131rma s\u00f6z konusuysa bir sonraki ad\u0131ma ge\u00e7ilecektir.\n<\/li>\n<li>3\ufe0f\u20e3.2\ufe0f\u20e3<strong><em>OTP<\/em><\/strong><br \/>\nBu ad\u0131m yaln\u0131zca bir \u00f6nceki condition true oldu\u011fu taktirde \u00e7al\u0131\u015facakt\u0131r. \u0130\u015flevsel olarak \u015funlar\u0131 kontrol edecektir:<br \/>\n\ud83e\udc12 Request i\u00e7erisinde <code>totp<\/code> parametresi var m\u0131?<br \/>\n\ud83e\udc12 G\u00f6nderilen OTP kodu do\u011fru mu?<br \/>\n\ud83e\udc12 Time Step Window ge\u00e7erli mi?<\/p>\n<p>E\u011fer ki <code>totp<\/code> yoksa yahut OTP kodu yanl\u0131\u015fsa request ba\u015far\u0131s\u0131z kabul edilecek, aksi taktirde ba\u015far\u0131l\u0131 bir giri\u015f yap\u0131lm\u0131\u015f olunacakt\u0131r&#8230;\n<\/li>\n<\/ul>\n<\/li>\n<\/ul>\n<p>\u015eimdi muhtemelen, giri\u015f ba\u015far\u0131l\u0131 oldu\u011fu taktirde token&#8217;\u0131n \u00fcretilmi\u015f olmas\u0131n\u0131 bekliyorsunuz, ancak flow&#8217;da hala token \u00fcretilmi\u015f de\u011fildir! \u00c7\u00fcnk\u00fc dikkat ederseniz token \u00fcretimi flow&#8217;un bir execution ad\u0131m\u0131 de\u011fildir \ud83d\ude09 Flow&#8217;dan sonra token Keycloak taraf\u0131ndan \u00fcretilecektir&#8230;<\/p>\n<h3><span class=\"ez-toc-section\" id=\"Direct_Grant_Flowda_Dikkat_Edilmesi_Gereken_Durumlar\"><\/span>Direct Grant Flow&#8217;da Dikkat Edilmesi Gereken Durumlar<span class=\"ez-toc-section-end\"><\/span><\/h3>\n<p>Direct grant flow&#8217;u kullanacaksan\u0131z ba\u015f\u0131n\u0131z\u0131n derde girme ihtimalini de de\u011ferlendirmeniz gerekmektedir. Haliyle bu de\u011ferlendirme s\u00fcrecini sizlerin ac\u0131 ve maliyetli tecr\u00fcbelerine b\u0131rakmaks\u0131z\u0131n bir ka\u00e7 madde e\u015fli\u011finde teoride de olsa deneyimlendirerek fark\u0131ndal\u0131\u011f\u0131n\u0131z\u0131 art\u0131rmakta fayda g\u00f6r\u00fcyorum \ud83d\ude42<\/p>\n<ol style=\"font-size:14px;\">\n<li><strong><em>Client ayarlar\u0131na dikkat edin!<\/em><\/strong><br \/>\nDirect grant kullan\u0131rken client&#8217;\u0131n mutlaka Confidential olmas\u0131 gerekmektedir \u00e7\u00fcnk\u00fc bu ak\u0131\u015fta kullan\u0131c\u0131 ad\u0131 ve \u015fifre do\u011frudan token endpoint&#8217;ine g\u00f6nderilir; e\u011fer client Public olursa ortada bir <code>client_secret<\/code> olmad\u0131\u011f\u0131 i\u00e7in hem uygulama kimli\u011fi do\u011frulanamaz hem de credential&#8217;\u0131n k\u00f6t\u00fcye kullan\u0131m riski ciddi \u015fekilde art\u0131\u015f g\u00f6sterebilir.<\/p>\n<p>Confidential client kullan\u0131ld\u0131\u011f\u0131nda ise Keycloak, kullan\u0131c\u0131 kimlik bilgilerini do\u011frulamadan \u00f6nce client&#8217;\u0131 da <code>client_id<\/code> + <code>client_secret<\/code> ile do\u011frular ve b\u00f6ylece hem kullan\u0131c\u0131 hem de uygulama taraf\u0131 g\u00fcvence alt\u0131na al\u0131nm\u0131\u015f olur. Aksi taktirde public client + direct grant kombinasyonu, \u00f6zellikle backend yerine istemci taraf\u0131nda kullan\u0131l\u0131yorsa, \u015fifre s\u0131z\u0131nt\u0131s\u0131na ve k\u00f6t\u00fcye kullan\u0131ma a\u00e7\u0131k bir yap\u0131 olu\u015fturabilir.<\/li>\n<li><strong><em>Direct Grant&#8217;\u0131 herkes i\u00e7in a\u00e7may\u0131n!<\/em><\/strong><br \/>\nDirect grant&#8217;i realm genelinde serbest b\u0131rakmak, yani varsay\u0131lan flow&#8217;u de\u011fi\u015ftirip t\u00fcm client&#8217;lar\u0131n <code>grant_type=password<\/code> ile token alabilmesine izin vermek ciddi bir g\u00fcvenlik riskidir. \u00c7\u00fcnk\u00fc bu durumda \u00f6zellikle web veya frontend client&#8217;lar da kullan\u0131c\u0131 ad\u0131 ve \u015fifreyi do\u011frudan token endpoint&#8217;ine g\u00f6nderebilir hale gelebilirler. Bu durum, credential s\u0131z\u0131nt\u0131s\u0131 ile brute force sald\u0131r\u0131s\u0131 y\u00fczeyini b\u00fcy\u00fctebilir ve risk ihtimallerini ister istemez art\u0131rabilir.<\/p>\n<div style=\"background-color: #f4f4f4; padding: 15px; border-left: 5px solid #3498db; margin: 20px 0; font-style: italic; color: #333; font-size: 14px; box-shadow: 0 2px 6px rgba(0, 0, 0, 0.1); border-radius: 8px; width: 40%; float: right; box-sizing: border-box;\">\n  <strong><em>Brute Force nedir?<\/em><\/strong> Brute force, bir sald\u0131rgan\u0131n ayn\u0131 kullan\u0131c\u0131 i\u00e7in s\u00fcrekli \u015fifre denemesi yapmas\u0131d\u0131r. Misal olarak; ahmet \/ 123456, ahmet \/ 1234567, ahmet \/ qwerty, ahmet \/ 11111 vs. \u015feklinde&#8230;<\/p>\n<p>Direct grant&#8217;te bu davran\u0131\u015f olduk\u00e7a tehlikeli hal alabilmektedir. \u00c7\u00fcnk\u00fc her \u015fey API \u00e7a\u011fr\u0131s\u0131 olarak cereyan ederken bu s\u00fcre\u00e7te login ekran\u0131 yok, captcha yok, UI yok&#8230; Yani bir script ile saniyede y\u00fczlerce deneme yap\u0131labilmesi m\u00fcmk\u00fcnd\u00fcr&#8230;\n<\/p>\n<\/div>\n<p>Bu mant\u0131kla, direct grant&#8217;i yaln\u0131zca ger\u00e7ekten ihtiya\u00e7 duyan ve backend taraf\u0131ndan g\u00fcvenli \u015fekilde \u00e7al\u0131\u015fan belirli, confidential client&#8217;lar i\u00e7in a\u00e7\u0131k tutmak, di\u011fer web ve public client&#8217;larda kapal\u0131 b\u0131rakmak en do\u011fru yakla\u015f\u0131m olacakt\u0131r.\n<\/li>\n<li><strong><em>Brute Force durumuna kar\u015f\u0131 haz\u0131rl\u0131kl\u0131 olun!<\/em><\/strong><br \/>\nDirect grant ak\u0131\u015f\u0131nda login ekran\u0131, captcha ya da kullan\u0131c\u0131y\u0131 yava\u015flatan herhangi bir g\u00f6rsel engel olmad\u0131\u011f\u0131 i\u00e7in token endpoint do\u011frudan otomatik denemelere a\u00e7\u0131k hale gelmektedir. Bu da bir sald\u0131rgan\u0131n script yazarak ayn\u0131 kullan\u0131c\u0131 i\u00e7in ya da farkl\u0131 kullan\u0131c\u0131 adlar\u0131yla h\u0131zl\u0131ca \u015fifre denemesi yapabilmesine imkan sa\u011flar. \u0130\u015fte bizler bu sald\u0131raya brute force sald\u0131r\u0131s\u0131 diyoruz.<\/p>\n<p>Bu fark\u0131ndal\u0131kla, Keycloak Admin UI \u00fczerinden <span style=\"font-size:14px;\"><code>Realm<\/code> \ud83e\udc12 <code>Security defenses<\/code> \ud83e\udc12 <code>Brute force detection<\/code><\/span> kombinasyonuna gelerek brute force&#8217;a kar\u015f\u0131 koruma davran\u0131\u015f\u0131 mutlaka aktif edilmelidir.<a href=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2026\/02\/Keycloak-Asp.NET-Core-Ile-Direct-Grant-Flow-Authentication-8.png\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2026\/02\/Keycloak-Asp.NET-Core-Ile-Direct-Grant-Flow-Authentication-8.png\" alt=\"Keycloak | Asp.NET Core \u0130le Direct Grant Flow Authentication #8\" width=\"1077\" height=\"622\" class=\"aligncenter size-full wp-image-28438\" srcset=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2026\/02\/Keycloak-Asp.NET-Core-Ile-Direct-Grant-Flow-Authentication-8.png 1077w, https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2026\/02\/Keycloak-Asp.NET-Core-Ile-Direct-Grant-Flow-Authentication-8-300x173.png 300w, https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2026\/02\/Keycloak-Asp.NET-Core-Ile-Direct-Grant-Flow-Authentication-8-1024x591.png 1024w, https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2026\/02\/Keycloak-Asp.NET-Core-Ile-Direct-Grant-Flow-Authentication-8-768x444.png 768w\" sizes=\"auto, (max-width: 1077px) 100vw, 1077px\" \/><\/a>Burada g\u00f6r\u00fcld\u00fc\u011f\u00fc \u00fczere d\u00f6rt farkl\u0131 yap\u0131land\u0131rmayla brute force&#8217;a kar\u015f\u0131 bir davran\u0131\u015f belirlenebilmektedir:<\/p>\n<ul>\n<li><u><em>Disabled<\/em><\/u>: Brute force korumas\u0131 kapal\u0131d\u0131r. Kullan\u0131c\u0131 ne kadar yanl\u0131\u015f deneme yaparsa yaps\u0131n hesap kilitlenmeyecektir.<\/li>\n<li><u><em>Lockout permanently<\/em><\/u>: Belirlenen ba\u015far\u0131s\u0131z deneme say\u0131s\u0131 a\u015f\u0131l\u0131nca hesap sadece adminin a\u00e7abilece\u011fi \u015fekilde kal\u0131c\u0131 olarak kilitlenecektir.<\/li>\n<li><u><em>Lockout temporarily<\/em><\/u>: Limit a\u015f\u0131l\u0131nca hesap belirli bir s\u00fcreli\u011fine kilitlenecek, s\u00fcre doldu\u011fu taktirde otomatik a\u00e7\u0131lacakt\u0131r.<\/li>\n<li><u><em>Lockout permanently after temporary lockout<\/em><\/u>: \u00d6nce ge\u00e7ici kilitleme uygulanacak, bu durum tekrar etti\u011fi taktirde hesap tamamen kilitlenecektir.<\/li>\n<\/ul>\n<p>Bizler bu yap\u0131land\u0131rmalar sayesinde ba\u015far\u0131s\u0131z deneme e\u015fi\u011fini (failure factor) istedi\u011fimiz gibi belirleyebilir ve hatal\u0131 denemeler bu e\u015fi\u011fi a\u015ft\u0131\u011f\u0131 taktirde ister ge\u00e7ici istersek de kal\u0131c\u0131 kilitleme (lockout) uygulayabiliriz.\n<\/li>\n<li><strong><em>MFA beklentisini do\u011fru ayarlay\u0131n!<\/em><\/strong><br \/>\nDirect grant ak\u0131\u015f\u0131, kullan\u0131c\u0131 ad\u0131 ve \u015fifreyi do\u011frudan API \u00fczerinden alarak token \u00fcretmeye yarad\u0131\u011f\u0131 i\u00e7in yaln\u0131zca password ve TOTP gibi basit OTP tabanl\u0131 MFA y\u00f6ntemlerini desteklemektedir. Ancak kullan\u0131c\u0131y\u0131 y\u00f6nlendirme ve ek do\u011frulama ekranlar\u0131 gerektiren SMS do\u011frulama, e-posta ile challenge, push notification yahut WebAuthn gibi etkile\u015fimli ve taray\u0131c\u0131 tabanl\u0131 ikinci fakt\u00f6rleri \u00e7al\u0131\u015ft\u0131ramamaktad\u0131r!<\/p>\n<p>Bu nedenle ileride daha geli\u015fmi\u015f veya farkl\u0131 MFA y\u00f6ntemlerinin eklenmesi planlan\u0131yorsa e\u011fer direct grant do\u011fru bir tercih olmayacak, onun yerine standart authorization code flow (bknz : <a href=\"https:\/\/www.gencayyildiz.com\/blog\/tag\/browser-flow-authentication\/\" target=\"_blank\">Browser Flow Authentication<\/a>) gibi taray\u0131c\u0131 destekli bir ak\u0131\u015f kullanmak daha isabetli olacakt\u0131r.\n<\/li>\n<li><strong><em>Token s\u00fcresini k\u0131salt\u0131n!<\/em><\/strong><br \/>\nDirect grant genellikle mobil uygulamalar, CLI ara\u00e7lar\u0131 ve scriptler taraf\u0131ndan kullan\u0131ld\u0131\u011f\u0131 i\u00e7in g\u00fcvenlik a\u00e7\u0131s\u0131ndan token s\u00fcrelerinin k\u0131sa tutulmas\u0131 \u00f6nerilmektedir. \u00d6zellikle access token \u00f6mr\u00fc m\u00fcmk\u00fcn oldu\u011funca k\u0131sa ayarlanmal\u0131, <a href=\"https:\/\/www.gencayyildiz.com\/blog\/tag\/refresh-token\/\" target=\"_blank\">refresh token<\/a> taraf\u0131nda ise rotation (her kullan\u0131mda yeni refresh token \u00fcretme) a\u00e7\u0131k olmal\u0131 ve reuse (eski refresh token&#8217;\u0131n tekrar kullan\u0131labilmesi) ise kapal\u0131 tutulmal\u0131d\u0131r. B\u00f6ylece bir token ele ge\u00e7irilse bile k\u0131sa s\u00fcrede ge\u00e7ersiz olacak ve yeniden kullan\u0131lma riski minimize edilmi\u015f olacakt\u0131r.\n<\/li>\n<li><strong><em>Scope ve rolleri minimal tutun!<\/em><\/strong><br \/>\nDirect grant ile al\u0131nan token&#8217;lar do\u011frudan kullan\u0131c\u0131 ad\u0131 ve \u015fifreyle \u00fcretildi\u011fi i\u00e7in g\u00fcvenlik a\u00e7\u0131s\u0131ndan daha hassas kabul edilirler. Bu nedenle, bu token&#8217;lara geni\u015f yetkiler vermek hi\u00e7 de do\u011fru de\u011fildir! \u00d6zellikle <em>realm-admin<\/em> gibi y\u00fcksek ayr\u0131cal\u0131kl\u0131 roller ya da <em>full access<\/em> benzeri geni\u015f scope&#8217;lar tan\u0131mlanmamal\u0131, bunun yerine sadece ger\u00e7ekten ihtiya\u00e7 duyulan scope ve roller verilerek <em><u>least privilege<\/u><\/em> prensibi uygulanmal\u0131d\u0131r. Yani uzun laf\u0131n k\u0131sas\u0131, direct grant bir anlamda daha riskli bir giri\u015f kap\u0131s\u0131 oldu\u011fu i\u00e7in, \u00fcretilen token&#8217;\u0131n yetkisi m\u00fcmk\u00fcn oldu\u011funca dar tutulmal\u0131d\u0131r!\n<\/li>\n<li><strong><em>Client credentials ile kar\u0131\u015ft\u0131rmay\u0131n!<\/em><\/strong><br \/>\nDirect grant ile <a href=\"https:\/\/www.gencayyildiz.com\/blog\/tag\/client-credentials\/\" target=\"_blank\">client credentials<\/a> ak\u0131\u015flar\u0131 s\u0131k\u00e7a kar\u0131\u015ft\u0131r\u0131l\u0131r ancak aralar\u0131nda temel bir fark vard\u0131r: Direct grant&#8217;te kullan\u0131c\u0131 ad\u0131 ve \u015fifre g\u00f6nderilerek cliet taraf\u0131ndan kullan\u0131c\u0131 ad\u0131na token al\u0131n\u0131r, yani ortada ger\u00e7ek bir user context vard\u0131r. Client credentials&#8217;ta ise hi\u00e7bir kullan\u0131c\u0131 yoktur, sadece client kendi kimli\u011fiyle (client id ve secret) token al\u0131r ve bu token uygulaman\u0131n kendisini temsil eder. Bu y\u00fczden direct grant user-based authentication i\u00e7inken, client credentials ise service-to-service ileti\u015fim senaryolar\u0131 i\u00e7in tercih edilir.\n<\/li>\n<li><strong><em>Logging &#038; monigoring&#8217;e \u00f6zen g\u00f6sterin!<\/em><\/strong><br \/>\nDirect grant ak\u0131\u015f\u0131 do\u011frudan <code>\/token<\/code> endpoint&#8217;i \u00fczerinden \u00e7al\u0131\u015ft\u0131\u011f\u0131 i\u00e7in brute force, credential stuffing ve otomatik sald\u0131r\u0131lara daha a\u00e7\u0131k bir y\u00fczey olu\u015fturmaktad\u0131r. Bu nedenle logging ve monitoring kritik bir \u00f6neme sahiptir. Ba\u015far\u0131s\u0131z login denemeleri, ola\u011fand\u0131\u015f\u0131 IP yo\u011funlu\u011fu, k\u0131sa s\u00fcrede \u00e7ok say\u0131da token talebi gibi anormallikler loglardan takip edilmeli ve m\u00fcmk\u00fcnse SIEM ya da benzeri bir izleme sistemine g\u00f6nderilerek alarm \u00fcretilmelidir. Aksi taktirde sald\u0131r\u0131lar sessizce ger\u00e7ekle\u015febilir ve ancak hasar olu\u015ftu\u011funda fark edilebilir.\n<\/li>\n<li><strong><em>HTTPS zorunlulu\u011funu \u00f6nemseyin!<\/em><\/strong><br \/>\nDirect grant ak\u0131\u015f\u0131nda kullan\u0131c\u0131 ad\u0131 ve \u015fifre do\u011frudan HTTP iste\u011fi body&#8217;sinde g\u00f6nderildi\u011fi i\u00e7in HTTPS kullan\u0131m\u0131 tart\u0131\u015fmas\u0131z \u015fekilde zorunludur. Aksi halde bu bilgiler a\u011f \u00fczerinde a\u00e7\u0131k metin olarak yakalanabilir ve kullan\u0131c\u0131 hesab\u0131 y\u00fcksek riskle kar\u015f\u0131 kar\u015f\u0131ya kalabilir. TLS sayesinde hem kimlik bilgileri hem de d\u00f6nen access token ve refresh token&#8217;lar \u015fifrelenmi\u015f \u015fekilde iletilir, b\u00f6ylece <em>man-in-the-middle<\/em> ve dinleme sald\u0131r\u0131lar\u0131na kar\u015f\u0131 temel g\u00fcvenlik sa\u011flanm\u0131\u015f olur.\n<\/li>\n<li><strong><em>Legacy mi, ge\u00e7ici mi iyi de\u011ferlendirin!<\/em><\/strong><br \/>\nDirect grant g\u00fcn\u00fcm\u00fczde daha \u00e7ok legacy ya da ge\u00e7i\u015f s\u00fcrecindeki senaryolar i\u00e7in tercih edilen bir ak\u0131\u015f olarak g\u00f6r\u00fclmektedir. \u00c7\u00fcnk\u00fc modern g\u00fcvenlik yakla\u015f\u0131m\u0131 kullan\u0131c\u0131y\u0131 do\u011frudan yetkilendirme sunucusuna y\u00f6nlendirerek authorization code flow gibi taray\u0131c\u0131 tabanl\u0131 ve MFA a\u00e7\u0131s\u0131ndan daha esnek ak\u0131\u015flar\u0131 kullanmay\u0131 \u00f6nerir. Bu nedenle, yeni geli\u015ftirilen sistemlerde m\u00fcmk\u00fcnse browser-based flow tercih edilmeli, direct grant ise ger\u00e7ekten zorunlu olan durumlarda kontroll\u00fc ve s\u0131n\u0131rl\u0131 yetkilerle kullan\u0131lmal\u0131d\u0131r.\n<\/li>\n<\/ol>\n<p>Yani k\u0131saca direct grant flow&#8217;u kullan\u0131rken neleri yap\u0131p yapmamam\u0131z gerekti\u011fini a\u015fa\u011f\u0131da \u015f\u00f6yle bir tabloda toparlayal\u0131m:<\/p>\n<table style=\"width:100%;border-collapse:collapse;font-family:Arial,Helvetica,sans-serif;font-size:15px;text-align:left;\">\n<thead>\n<tr>\n<th style=\"padding:12px;border:1px solid #e5e7eb;background-color:#ecfdf5;color:#065f46;font-weight:600;\">\u2705 Yap<\/th>\n<th style=\"padding:12px;border:1px solid #e5e7eb;background-color:#fef2f2;color:#7f1d1d;font-weight:600;\">\u274c Yapma<\/th>\n<\/tr>\n<\/thead>\n<tbody>\n<tr>\n<td style=\"padding:10px;border:1px solid #e5e7eb;background-color:#f0fdf4;color:#064e3b;\">Confidential client<\/td>\n<td style=\"padding:10px;border:1px solid #e5e7eb;background-color:#fff1f2;color:#7f1d1d;\">Frontend\u2019ten direct grant<\/td>\n<\/tr>\n<tr>\n<td style=\"padding:10px;border:1px solid #e5e7eb;background-color:#f0fdf4;color:#064e3b;\">Sadece belirli client\u2019larda aktif<\/td>\n<td style=\"padding:10px;border:1px solid #e5e7eb;background-color:#fff1f2;color:#7f1d1d;\">Public client<\/td>\n<\/tr>\n<tr>\n<td style=\"padding:10px;border:1px solid #e5e7eb;background-color:#f0fdf4;color:#064e3b;\">Brute force protection<\/td>\n<td style=\"padding:10px;border:1px solid #e5e7eb;background-color:#fff1f2;color:#7f1d1d;\">MFA beklentisi<\/td>\n<\/tr>\n<tr>\n<td style=\"padding:10px;border:1px solid #e5e7eb;background-color:#f0fdf4;color:#064e3b;\">K\u0131sa token s\u00fcreleri<\/td>\n<td style=\"padding:10px;border:1px solid #e5e7eb;background-color:#fff1f2;color:#7f1d1d;\">Geni\u015f yetkiler<\/td>\n<\/tr>\n<tr>\n<td style=\"padding:10px;border:1px solid #e5e7eb;background-color:#f0fdf4;color:#064e3b;\">Minimal yetki<\/td>\n<td style=\"padding:10px;border:1px solid #e5e7eb;background-color:#fff1f2;color:#7f1d1d;\">S\u0131n\u0131rs\u0131z login denemesi<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<h3><span class=\"ez-toc-section\" id=\"12_Kritik_Soru_12_Kritik_Cevap\"><\/span>12 Kritik Soru \/ 12 Kritik Cevap<span class=\"ez-toc-section-end\"><\/span><\/h3>\n<p>\u015eimdi direct grant flow ile ilgili akla gelebilecek t\u00fcm kritik sorular\u0131 sorup, cevapland\u0131rmaya \u00e7al\u0131\u015fal\u0131m ve b\u00f6ylece konuya dair teferruatlar\u0131 da tamamlayarak teoride t\u00fcm y\u00f6nleriyle incelemeyi tamamlam\u0131\u015f olal\u0131m.<\/p>\n<details style=\"font-size:14px;\">\n<summary style=\"color:#BA8073;\">Soru 1 | <span style=\"color:#877572;\">Direct Grant Flow tam olarak hangi OAuth2 grant&#8217;ine kar\u015f\u0131l\u0131k gelmektedir?<\/span><\/summary>\n<p>Kullan\u0131c\u0131n\u0131n \u015fifresini do\u011frudan uygulamaya verdi\u011fi ve uygulaman\u0131n da bu bilgileri <code>\/token<\/code> endpoint&#8217;ine iletti\u011fi Resource Owner Password Credentials Grant&#8217;e kar\u015f\u0131l\u0131k gelmektedir.<\/p>\n<p><span style=\"font-size:12px;\">Not : Resource Owner Password Credentials Grant, OAuth2 d\u00fcnyas\u0131nda deprecated kabul edilen bir yakla\u015f\u0131m olsa dahi Keycloak bu yakla\u015f\u0131m\u0131 hala kontroll\u00fc bir \u015fekilde desteklemektedir.<\/span><br \/>\n<\/details>\n<details style=\"font-size:14px;\">\n<summary style=\"color:#BA8073;\">Soru 2 | <span style=\"color:#877572;\">Keycloak neden Direct Grant&#8217;\u0131 varsay\u0131lan olarak \u00f6n plana \u00e7\u0131karmaz?<\/span><\/summary>\n<p>\u00c7\u00fcnk\u00fc; OAuth&#8217;un temel amac\u0131 \u015fifreyi client&#8217;tan saklamakt\u0131r. Haliyle direct grant bu ilkeyi bile bile bozmaktad\u0131r.<\/p>\n<p>Keycloak, <em>-bu ak\u0131\u015f\u0131 kullan\u0131ysan, ne yapt\u0131\u011f\u0131n\u0131 biliyorsundur-<\/em> varsay\u0131m\u0131yla hareket etmektedir.<br \/>\n<\/details>\n<details style=\"font-size:14px;\">\n<summary style=\"color:#BA8073;\">Soru 3 | <span style=\"color:#877572;\">Direct Grant ile SSO neden m\u00fcmk\u00fcn de\u011fildir?<\/span><\/summary>\n<p>Direct grant; stateless \u00e7al\u0131\u015fmaktad\u0131r ve cookie \u00fcretmemektedir, ayr\u0131ca browser context&#8217;i yoktur. Bundan kaynakl\u0131 SSO uygulanamamaktad\u0131r. Dolay\u0131s\u0131yla bu ak\u0131\u015fla elde edilen token sadece o uygulamaya\/client&#8217;a aittir.<br \/>\n<\/details>\n<details style=\"font-size:14px;\">\n<summary style=\"color:#BA8073;\">Soru 4 | <span style=\"color:#877572;\">Direct Grant ile login olan kullan\u0131c\u0131 Keycloak UI&#8217;da oturum a\u00e7m\u0131\u015f say\u0131l\u0131r m\u0131?<\/span><\/summary>\n<p>Hay\u0131r! Direct grant ile login olundu\u011funda Keycloak bir access token ve refresh token \u00fcretir ancak bu i\u015flem taray\u0131c\u0131 \u00fczerinden ger\u00e7ekle\u015fmedi\u011fi i\u00e7in Keycloak taraf\u0131ndan bir browser session (SSO session) olu\u015fturulmaz. Haliyle kullan\u0131c\u0131 ger\u00e7ekten Keycloak login ekran\u0131na girip oturum a\u00e7m\u0131\u015f gibi say\u0131lmaz. Bu y\u00fczden Admin Console&#8217;daki aktif oturumlar listesinde bir &#8220;taray\u0131c\u0131 oturumu&#8221; g\u00f6r\u00fclemez. K\u0131saca, direct grant API kullan\u0131m\u0131 i\u00e7in ge\u00e7erli bir token verecektir ancak bu Keycloak UI&#8217;da a\u00e7\u0131lm\u0131\u015f bir oturum anlam\u0131na gelmeyecektir. Yani token&#8217;\u0131n var olmas\u0131, browser session&#8217;\u0131n var olmas\u0131 demek de\u011fildir!<br \/>\n<\/details>\n<details style=\"font-size:14px;\">\n<summary style=\"color:#BA8073;\">Soru 5 | <span style=\"color:#877572;\">Direct Grant&#8217;te MFA neden s\u0131n\u0131rl\u0131d\u0131r?<\/span><\/summary>\n<p>\u00c7\u00fcnk\u00fc kullan\u0131c\u0131n\u0131n etkile\u015fime girecek bir ekran\u0131 yoktur ve bu nedenle challenge-response yap\u0131s\u0131 kullan\u0131lamamaktad\u0131r.<\/p>\n<p>Haliyle direct grant&#8217;te TOTP kullan\u0131m\u0131 m\u00fcmk\u00fcnken; SMS, e-mail, Push vs. kullanmak m\u00fcmk\u00fcn de\u011fildir!<br \/>\n<span style=\"font-size:12px;\"><strong>Neden TOTP m\u00fcmk\u00fcnde di\u011ferleri de\u011fil?<\/strong><br \/>\n\u00c7\u00fcnk\u00fc TOTP tamamen statik ve senkron bir ikinci fakt\u00f6rd\u00fcr de ondan. Yani kullan\u0131c\u0131, telefonundaki authenticator uygulamas\u0131ndan 6 haneli kodu g\u00f6rebilir ve direct grant iste\u011fi s\u00fcrecinde bu kodu \u015fifreyle birlikte g\u00f6nderebilir. Bunun i\u00e7in ekstradan bir y\u00f6nlendirme, challenge ba\u015flatma ya da kullan\u0131c\u0131yla etkile\u015fime vs. gerek yoktur!<\/p>\n<p>Ancak SMS, e-posta veya push do\u011frulama y\u00f6ntemleri challenge-response mant\u0131\u011f\u0131yla \u00e7al\u0131\u015fmaktad\u0131rlar. \u00d6nce sunucu bir kod \u00fcretecek ve kullan\u0131c\u0131ya g\u00f6nderecektir, kullan\u0131c\u0131 o bildirimi g\u00f6recek ve kimi zaman linke t\u0131klayacak kimi zaman da onay verecektir. Yani s\u00fcre\u00e7 ne olursa olsun bir ka\u00e7 ad\u0131ml\u0131 etkile\u015fim gerektirecektir.<\/p>\n<p>Direct grant&#8217;\u0131n yap\u0131sal olarak tek bir HTTP iste\u011finde kullan\u0131c\u0131 ad\u0131 ve \u015fifre (ve varsa OTP) ile token \u00fcretmek i\u00e7in tasarlanmas\u0131; ara ad\u0131mlar\u0131, beklemeleri, y\u00f6nlendirmeleri veya kullan\u0131c\u0131 etkile\u015fimlerini bar\u0131nd\u0131rmamaktad\u0131r. Dolay\u0131s\u0131yla SMS\/push gibi asenkron ve etkile\u015fimli MFA y\u00f6ntemlerini teknik olarak \u00e7al\u0131\u015ft\u0131rmas\u0131 m\u00fcmk\u00fcn de\u011fildir!<br \/>\n<\/span><br \/>\n<\/details>\n<\/details>\n<details style=\"font-size:14px;\">\n<summary style=\"color:#BA8073;\">Soru 6 | <span style=\"color:#877572;\">Direct Grant Flow&#8217;a custom authentication step eklenebilir mi?<\/span><\/summary>\n<p>Evet eklenebilir. Misal olarak; custom credential validator, custom OTP check yahut IP \/ device kontrol\u00fc gibi \u00f6zel ad\u0131mlar eklenebilir. Ama kullan\u0131c\u0131dan ek bilgi isteyen ad\u0131mlar eklenemezler.<br \/>\n<\/details>\n<details style=\"font-size:14px;\">\n<summary style=\"color:#BA8073;\">Soru 7 | <span style=\"color:#877572;\">Direct Grant neden frontend uygulamalarda kesinlikle \u00f6nerilmez?<\/span><\/summary>\n<p>\u00c7\u00fcnk\u00fc, frontend&#8217;de direct grant&#8217;i kullanmak demek \u015fifreyi istemciye emanet etmek demektir. Haliyle \u015fifre XSS ile \u00e7al\u0131nabilir ve network log&#8217;lar\u0131nda g\u00f6r\u00fclebilir.<br \/>\n<\/details>\n<details style=\"font-size:14px;\">\n<summary style=\"color:#BA8073;\">Soru 8 | <span style=\"color:#877572;\">Direct Grant ile Client Credentials aras\u0131ndaki kritik fark nedir?<\/span><\/summary>\n<table style=\"width:100%;border-collapse:collapse;font-family:-apple-system,BlinkMacSystemFont,'Segoe UI',Roboto,Helvetica,Arial,sans-serif;font-size:13px;color:#1f2937;\">\n<thead>\n<tr>\n<th style=\"padding:8px 10px;border-bottom:1px solid #e5e7eb;text-align:left;font-weight:600;background-color:#f9fafb;\">Direct Grant<\/th>\n<th style=\"padding:8px 10px;border-bottom:1px solid #e5e7eb;text-align:left;font-weight:600;background-color:#f9fafb;\">Client Credentials<\/th>\n<\/tr>\n<\/thead>\n<tbody>\n<tr>\n<td style=\"padding:8px 10px;border-bottom:1px solid #f1f5f9;text-align:left;\">Kullan\u0131c\u0131 vard\u0131r<\/td>\n<td style=\"padding:8px 10px;border-bottom:1px solid #f1f5f9;text-align:left;\">Kullan\u0131c\u0131 yok<\/td>\n<\/tr>\n<tr>\n<td style=\"padding:8px 10px;border-bottom:1px solid #f1f5f9;text-align:left;\">Username + password<\/td>\n<td style=\"padding:8px 10px;border-bottom:1px solid #f1f5f9;text-align:left;\">Client ID + secret<\/td>\n<\/tr>\n<tr>\n<td style=\"padding:8px 10px;border-bottom:1px solid #f1f5f9;text-align:left;\">User context<\/td>\n<td style=\"padding:8px 10px;border-bottom:1px solid #f1f5f9;text-align:left;\">App context<\/td>\n<\/tr>\n<tr>\n<td style=\"padding:8px 10px;text-align:left;\">Riskli<\/td>\n<td style=\"padding:8px 10px;text-align:left;\">Daha g\u00fcvenli<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<p>Kullan\u0131c\u0131 ad\u0131na i\u015flem yap\u0131yorsan direct grant, sistem ad\u0131na yap\u0131yorsan client credentials tercih edilmelidir.<br \/>\n<\/details>\n<details style=\"font-size:14px;\">\n<summary style=\"color:#BA8073;\">Soru 9 | <span style=\"color:#877572;\">Direct client ile al\u0131nan token revoke edilebilir mi?<\/span><\/summary>\n<p><strong>Revoke<\/strong>, bir token&#8217;\u0131 ya da oturumu ge\u00e7ersiz k\u0131lmak yani iptal etmek demektir. Daha \u00f6nce \u00fcretilmi\u015f ve normalde s\u00fcresi dolana kadar ge\u00e7erli olmas\u0131 beklenen bir access token&#8217;\u0131 veya refresh token&#8217;\u0131, s\u00fcresi dolmadan \u00f6nce art\u0131k kullan\u0131lamaz hale getirmek anlam\u0131na gelmektedir.<\/p>\n<p>Keycloak&#8217;da direct grant ile al\u0131nan token&#8217;da tabi ki de revoke edilebilir ancak browser session olmad\u0131\u011f\u0131 i\u00e7in revoke fark\u0131 kullan\u0131c\u0131 taraf\u0131ndan hemen hissedilmeyecektir.<br \/>\n<\/details>\n<details style=\"font-size:14px;\">\n<summary style=\"color:#BA8073;\">Soru 10 | <span style=\"color:#877572;\">Direct Grant neden &#8216;ge\u00e7ici \u00e7\u00f6z\u00fcm&#8217; olarak g\u00f6r\u00fclmelidir?<\/span><\/summary>\n<p>\u00c7\u00fcnk\u00fc g\u00fcvenlik modeli zay\u0131fd\u0131r. Ayr\u0131ca MFA uyumsuzlu\u011fu, SSO davran\u0131\u015f\u0131n\u0131n olmay\u0131\u015f\u0131 ve modern yakla\u015f\u0131mlara ters olmas\u0131 bu d\u00fc\u015f\u00fcnceyi do\u011furmaktad\u0131r.<br \/>\n<\/details>\n<details style=\"font-size:14px;\">\n<summary style=\"color:#BA8073;\">Soru 11 | <span style=\"color:#877572;\">Direct Grant kullanan bir client compromise olursa ne olur?<\/span><\/summary>\n<p>Direct grant kullanan bir client&#8217;\u0131n compromise olmas\u0131 (yani uygulaman\u0131n ya da client secret&#8217;\u0131n\u0131n ele ge\u00e7irilmesi durumunda), ciddi g\u00fcvenlik riskleri s\u00f6z konusu olur. \u00c7\u00fcnk\u00fc bu ak\u0131\u015fta kullan\u0131c\u0131 ad\u0131 ve \u015fifre do\u011frudan uygulama taraf\u0131ndan al\u0131nd\u0131\u011f\u0131 i\u00e7in credential&#8217;lar s\u0131zabilir, \u00fcretilmi\u015f access ve refresh token&#8217;lar ele ge\u00e7irilebilir ve e\u011fer token&#8217;lara geni\u015f scope verilmi\u015fse sistem i\u00e7inde b\u00fcy\u00fck yetkiler k\u00f6t\u00fcye kullan\u0131labilir. Bu nedenle direct grant senaryolar\u0131nda token \u00f6m\u00fcrleri k\u0131sa tutulmal\u0131, refresh token g\u00fcvenli\u011fi s\u0131k\u0131 ayarlanmal\u0131, client&#8217;a minimum yetki verilmeli ve mutlaka etkin bir loglama d\u00fczene\u011fi ile izleme yap\u0131lmal\u0131d\u0131r.<br \/>\n<\/details>\n<details style=\"font-size:14px;\">\n<summary style=\"color:#BA8073;\">Soru 12 | <span style=\"color:#877572;\">Direct Grant Flow&#8217;da en kritik g\u00fcvenlik ayar\u0131 hangisidir?<\/span><\/summary>\n<p>Yukar\u0131daki sat\u0131rlarda vurgulamaya \u00e7al\u0131\u015ft\u0131\u011f\u0131m gibi brute force protection ayar\u0131d\u0131r.<br \/>\n<\/details>\n<h3><span class=\"ez-toc-section\" id=\"AspNET_Core_Ile_Direct_Grant_Flow_Calismasi\"><\/span>Asp.NET Core \u0130le Direct Grant Flow \u00c7al\u0131\u015fmas\u0131<span class=\"ez-toc-section-end\"><\/span><\/h3>\n<p>Evet, teoriyi yeterince konu\u015ftuk \ud83d\ude0a Art\u0131k s\u0131ra bu ak\u0131\u015f\u0131 ASP.NET Core \u00fczerinde ad\u0131m ad\u0131m, \u00e7al\u0131\u015fan bir \u00f6rnekle hayata ge\u00e7irmeye gelmi\u015ftir. Tabi bunun i\u00e7in ilk olarak bir Asp.NET Core uygulamas\u0131 ile birlikte Keycloak&#8217;da a\u015fa\u011f\u0131daki konfig\u00fcrasyonlarda <code>application-client<\/code> isimli bir client olu\u015fturulmas\u0131 gerekmektedir.<a href=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2026\/02\/Keycloak-Asp.NET-Core-Ile-Direct-Grant-Flow-Authentication-8-1.png\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2026\/02\/Keycloak-Asp.NET-Core-Ile-Direct-Grant-Flow-Authentication-8-1.png\" alt=\"Keycloak | Asp.NET Core \u0130le Direct Grant Flow Authentication #8\" width=\"667\" height=\"376\" class=\"aligncenter size-full wp-image-28441\" srcset=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2026\/02\/Keycloak-Asp.NET-Core-Ile-Direct-Grant-Flow-Authentication-8-1.png 667w, https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2026\/02\/Keycloak-Asp.NET-Core-Ile-Direct-Grant-Flow-Authentication-8-1-300x169.png 300w\" sizes=\"auto, (max-width: 667px) 100vw, 667px\" \/><\/a>Dikkat ederseniz direct grant flow i\u00e7in olu\u015fturulacak client&#8217;\u0131n sade ve sadece <em>Direct access grants<\/em> olmas\u0131 yeterlidir. Ancak sizler isterseniz <em>Client authentication<\/em>&#8216;\u0131 da a\u00e7abilir ve s\u00fcre\u00e7te <code>client_secret<\/code> de\u011ferini de kullanabilirsiniz.<\/p>\n<p>Hatta bu yakla\u015f\u0131m, mimarisel olarak g\u00fcvenlik modelini farkl\u0131 bir yere ta\u015f\u0131man\u0131za imkan tan\u0131yabilir. \u015e\u00f6yle ki; client authentication olmaks\u0131z\u0131n herhangi bir client&#8217;tan yanl\u0131zca username &#038; password e\u015fli\u011finde Keycloak&#8217;dan token talep edebilirsiniz. Ancak client authentication ile token talebini, kendi olu\u015fturdu\u011funuz bir arac\u0131 API&#8217;ye y\u00f6nlendirebilir ve <code>client_id<\/code> + <code>client_secret<\/code> ile birlikte direct grant flow&#8217;u uygulayabilirsiniz. B\u00f6ylece token talebinde bulunan client, ister bir backend uygulamas\u0131 olsun isterse de SPA fark etmeksizin <code>client_secret<\/code> de\u011ferini g\u00f6rmeyecek, bu de\u011fer yaln\u0131zca \u00f6zel arac\u0131 olarak olu\u015fturulan API&#8217;da tutulmu\u015f olacak ve o API \u00fczerinden token talebinde bulunulmu\u015f olacakt\u0131r.<\/p>\n<p>Ancak bu durum sizlere \u00e7ok ideal gibi gelse de bana sorarsan\u0131z direct grant flow&#8217;u uygulayaca\u011f\u0131n\u0131z \u00e7al\u0131\u015fmalar da pek \u00f6nermedi\u011fim bir yakla\u015f\u0131md\u0131r. <em>Neden mi?<\/em> Zaten modern OAuth \/ OIDC yakla\u015f\u0131m\u0131n\u0131n \u00f6zellikle ka\u00e7\u0131nmaya \u00e7al\u0131\u015ft\u0131\u011f\u0131 \u015fey kullan\u0131c\u0131 \u015fifresinin uygulamalardan uzakla\u015ft\u0131r\u0131lmas\u0131d\u0131r. Haliyle bizler bu yakla\u015f\u0131m\u0131 benimsedi\u011fimiz taktirde kullan\u0131c\u0131 ad\u0131 ve \u015fifresi yine bizlere ait uygulaman\u0131n elinden ge\u00e7iyor olacakt\u0131r ve bu durum zaten istenmeyen vaziyetin ta kendisi olacakt\u0131r. Tamam, belki Keycloak&#8217;dan token isteyen client&#8217;\u0131n kim oldu\u011funa dair biraz daha s\u0131k\u0131 \u00e7al\u0131\u015fma sa\u011flanm\u0131\u015f olacak ama g\u00fcvenlik zincirinin halkas\u0131nda pek etken olmayacakt\u0131r. Hem, direct grant&#8217;i kullan\u0131yorsan\u0131z e\u011fer zaten do\u011fas\u0131 gere\u011fi g\u00fcvenlik eksikli\u011fi oldu\u011funun fark\u0131nda olman\u0131z gerekmekte ve bu tarz u\u011fra\u015flara girmenin pek de l\u00fczumlu olmad\u0131\u011f\u0131n\u0131 s\u00f6ylemekte fayda g\u00f6rmekteyim.<\/p>\n<p>Haliyle; direct grant, client authentication ile teoride daha s\u0131k\u0131 bir g\u00fcvenlik sa\u011fl\u0131yormu\u015f gibi g\u00f6r\u00fcnse de pratikte kazan\u0131m\u0131 olduk\u00e7a d\u00fc\u015f\u00fck ve hatta gereksiz bir u\u011fra\u015f olacakt\u0131r. E\u011fer ger\u00e7ekten g\u00fcvenli\u011fi art\u0131rmak istiyorsan\u0131z direct grant&#8217;ten vazge\u00e7ip autorization code + PKCE&#8217;ye ge\u00e7mek \u00e7ok daha do\u011fru bir hamle olacakt\u0131r.<\/p>\n<p>Evet, art\u0131k Keycloak&#8217;da client&#8217;\u0131 olu\u015fturdu\u011fumuza g\u00f6re s\u0131ra Asp.NET Core uygulamas\u0131na gelmi\u015ftir. Bu uygulaman\u0131n temellerini a\u015fa\u011f\u0131daki k\u00fct\u00fcphaneler e\u015fli\u011finde g\u00f6sterildi\u011fi gibi yap\u0131land\u0131ral\u0131m:<\/p>\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.OpenApi\" target=\"_blank\">Microsoft.AspNetCore.OpenApi<\/a><br \/>\n<a href=\"https:\/\/www.nuget.org\/packages\/Scalar.AspNetCore\" target=\"_blank\">Scalar.AspNetCore<\/a>\n<\/div>\n<div style=\"font-size:12px;\">\n<pre class=\"brush: jscript; title: ; notranslate\" title=\"\">\r\nusing Microsoft.AspNetCore.Mvc;\r\nusing Scalar.AspNetCore;\r\nusing Shared.Modals.Request;\r\n\r\nvar builder = WebApplication.CreateBuilder(args);\r\n\r\nbuilder.Services.AddOpenApi();\r\n\r\nbuilder.Services.AddHttpClient(&quot;keycloak&quot;, configure =&gt;\r\n{\r\n    configure.BaseAddress = new Uri(&quot;http:\/\/127.0.0.1:8080&quot;);\r\n});\r\n\r\nvar app = builder.Build();\r\n\r\nif (app.Environment.IsDevelopment())\r\n{\r\n    app.MapOpenApi();\r\n    app.MapScalarApiReference(options =&gt;\r\n    {\r\n        options.Layout = ScalarLayout.Classic;\r\n        options.WithTheme(ScalarTheme.BluePlanet);\r\n    });\r\n}\r\n\r\n.\r\n.\r\n.\r\n\r\napp.Run();\r\n<\/pre>\n<\/div>\n<p>Ve direct grant ile token talebini \u015f\u00f6yle bir endpoint ile ger\u00e7ekle\u015ftirelim:<\/p>\n<div style=\"font-size:12px;\">\n<pre class=\"brush: jscript; title: ; notranslate\" title=\"\">\r\napp.MapPost(&quot;\/login\/{realm}&quot;, async (LoginRequest loginRequest, IHttpClientFactory httpClientFactory, string realm = &quot;master&quot;) =&gt;\r\n{\r\n    var httpClient = httpClientFactory.CreateClient(&quot;keycloak&quot;);\r\n\r\n    var parameters = new Dictionary&lt;string, string&gt;\r\n    {\r\n        &#x5B;&quot;grant_type&quot;] = &quot;password&quot;,\r\n        &#x5B;&quot;client_id&quot;] = &quot;application-client&quot;,\r\n        \/\/&#x5B;&quot;client_secret&quot;] = &quot;TSQ7dhxgymeqxPunV18S3WQY6dmBY9Il&quot;,\r\n        &#x5B;&quot;username&quot;] = loginRequest.Username,\r\n        &#x5B;&quot;password&quot;] = loginRequest.Password\r\n    };\r\n\r\n    var response = await httpClient.PostAsync($&quot;realms\/{realm}\/protocol\/openid-connect\/token&quot;, new FormUrlEncodedContent(parameters));\r\n\r\n    if (!response.IsSuccessStatusCode)\r\n        return Results.Unauthorized();\r\n\r\n    var token = await response.Content.ReadFromJsonAsync&lt;Shared.Modals.Responses.AccessTokenResponse&gt;();\r\n    return Results.Ok(token);\r\n});\r\n<\/pre>\n<\/div>\n<p>\u0130\u015fte bu kadar \ud83d\ude42 \u015eu ana kadar t\u00fcm risklerini aktarmaya \u00e7al\u0131\u015ft\u0131\u011f\u0131m bu ak\u0131\u015f esas\u0131nda bu kadar basit bir \u015fekilde uygulanabilen bir yakla\u015f\u0131ma sahiptir. Ve evet, bu endpoint&#8217;e gerekli bilgiler do\u011frultusunda istekte bulunuldu\u011fu taktirde a\u015fa\u011f\u0131daki gibi token elde ediliyor olacakt\u0131r.<a href=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2026\/02\/Keycloak-Asp.NET-Core-Ile-Direct-Grant-Flow-Authentication-8-2.png\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2026\/02\/Keycloak-Asp.NET-Core-Ile-Direct-Grant-Flow-Authentication-8-2.png\" alt=\"Keycloak | Asp.NET Core \u0130le Direct Grant Flow Authentication #8\" width=\"639\" height=\"227\" class=\"aligncenter size-full wp-image-28443\" srcset=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2026\/02\/Keycloak-Asp.NET-Core-Ile-Direct-Grant-Flow-Authentication-8-2.png 639w, https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2026\/02\/Keycloak-Asp.NET-Core-Ile-Direct-Grant-Flow-Authentication-8-2-300x107.png 300w\" sizes=\"auto, (max-width: 639px) 100vw, 639px\" \/><\/a>Tabi \u015fu andaki durumuyla ilgili client her t\u00fcrl\u00fc sald\u0131r\u0131ya a\u00e7\u0131k vaziyettedir. Haliyle bu realm&#8217;de direct grant flow kullan\u0131ld\u0131\u011f\u0131 i\u00e7in <em>brute force protection<\/em>&#8216;\u0131n a\u00e7\u0131lmas\u0131n\u0131 ve <em>rate limiting<\/em>&#8216;in uygulanmas\u0131n\u0131 tavsiye ederim. Ayr\u0131ca \u015fu a\u015famadan sonra sistemi en k\u00f6t\u00fc ihtimal loglarla takip etmeyi ihmal etmemek gerekmektedir&#8230;<\/p>\n<h5><span class=\"ez-toc-section\" id=\"Token_Ile_APIyi_Koruyalim%E2%80%A6\"><\/span>Token \u0130le API&#8217;yi Koruyal\u0131m&#8230;<span class=\"ez-toc-section-end\"><\/span><\/h5>\n<p>Evet, bunun i\u00e7in ekstradan bir Asp.NET Core projesi olu\u015fturmaya gerek g\u00f6rmemekteyim. Mevcut uygulamam\u0131zda bir endpoint&#8217;i korumal\u0131 hale getirebilir ve do\u011frulamay\u0131 ger\u00e7ekle\u015ftirebiliriz.<\/p>\n<p>\u015eimdi bunun i\u00e7in mevcut uygulamada a\u015fa\u011f\u0131daki gibi authentication ve authorization yap\u0131land\u0131rmalar\u0131nda bulunal\u0131m:<\/p>\n<div style=\"font-size:12px;\">\n<pre class=\"brush: jscript; title: ; notranslate\" title=\"\">\r\nvar builder = WebApplication.CreateBuilder(args);\r\n\r\nbuilder.Services.AddAuthentication(JwtBearerDefaults.AuthenticationScheme)\r\n                .AddJwtBearer(JwtBearerDefaults.AuthenticationScheme, options =&gt;\r\n                {\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\r\nbuilder.Services.AddAuthorization();\r\n.\r\n.\r\n.\r\nvar app = builder.Build();\r\n\r\napp.UseAuthentication()\r\n   .UseAuthorization();\r\n.\r\n.\r\n.\r\napp.Run();\r\n<\/pre>\n<\/div>\n<p>Ard\u0131ndan a\u015fa\u011f\u0131daki gibi korumal\u0131 bir endpoint tasarlayal\u0131m:<\/p>\n<div style=\"font-size:12px;\">\n<pre class=\"brush: jscript; title: ; notranslate\" title=\"\">\r\napp.MapGet(&quot;\/profile&quot;, (HttpContext httpContext) =&gt;\r\n{\r\n    return Results.Ok(new\r\n    {\r\n        httpContext.User.Identity?.Name,\r\n        Claims = httpContext.User.Claims.Select(claim =&gt; new { claim.Type, claim.Value })\r\n    });\r\n}).RequireAuthorization();\r\n<\/pre>\n<\/div>\n<p>\u0130\u015fte tamamd\u0131r&#8230; Art\u0131k token edinmeksizin bu endpoint&#8217;e istekte bulunulamayacakt\u0131r. Tabi bunun testini sizlere b\u0131rak\u0131yor ve bu i\u00e7eri\u011fi art\u0131k noktal\u0131yorum \ud83d\ude42<\/p>\n<p>Nihai olarak;<br \/>\nBu i\u00e7eri\u011fimizde direct grant flow&#8217;un tam teferruatl\u0131 incelemi\u015f ve nedir, nas\u0131l yap\u0131l\u0131rdan ziyade genel \u00e7izginin d\u0131\u015f\u0131na \u00e7\u0131karak ilgili flow&#8217;u dikkat edilmesi gereken hususlar do\u011frultusunda ciddi bir ara\u015ft\u0131rma ve inceleme s\u00fcrecine tabi tutmu\u015f bulunmaktay\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\/Keycloak5.AspNETCore-%C4%B0le-Direct-Grant-Flow-Authentication\" 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 kullan\u0131c\u0131y\u0131 login ekran\u0131na hi\u00e7 y\u00f6nlendirmeksizin, uygulama arac\u0131l\u0131\u011f\u0131yla username + password&#8217;\u00fc do\u011frudan Keycloak&#8217;a g\u00f6nderip access token al\u0131nmas\u0131n\u0131 sa\u011flayacak olan Direct Grant Flow davran\u0131\u015f\u0131n\u0131 mercek alt\u0131na al\u0131yor olaca\u011f\u0131z. Direct Grant Flow Nas\u0131l Bir&#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,5554],"tags":[5662,5661,5616,5659,5555,5610,5660],"class_list":["post-28434","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-net","category-keycloak","tag-brute-force","tag-device-authorization-grant","tag-direct-grant-flow","tag-direct-grant-flow-authentication","tag-keycloak","tag-resource-owner-password-credentials-grant","tag-resource-owner-password-grant"],"amp_enabled":true,"_links":{"self":[{"href":"https:\/\/www.gencayyildiz.com\/blog\/wp-json\/wp\/v2\/posts\/28434","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=28434"}],"version-history":[{"count":13,"href":"https:\/\/www.gencayyildiz.com\/blog\/wp-json\/wp\/v2\/posts\/28434\/revisions"}],"predecessor-version":[{"id":28460,"href":"https:\/\/www.gencayyildiz.com\/blog\/wp-json\/wp\/v2\/posts\/28434\/revisions\/28460"}],"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=28434"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.gencayyildiz.com\/blog\/wp-json\/wp\/v2\/categories?post=28434"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.gencayyildiz.com\/blog\/wp-json\/wp\/v2\/tags?post=28434"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}