{"id":4378,"date":"2023-11-19T19:14:55","date_gmt":"2023-11-19T18:14:55","guid":{"rendered":"https:\/\/gokhan-gokalp.com\/?p=4378"},"modified":"2023-11-19T19:36:05","modified_gmt":"2023-11-19T18:36:05","slug":"delegating-identity-and-access-management-to-azure-ad-b2c-and-integrating-with-dotnet","status":"publish","type":"post","link":"https:\/\/gokhan-gokalp.com\/tr\/delegating-identity-and-access-management-to-azure-ad-b2c-and-integrating-with-dotnet\/","title":{"rendered":"Identity &#038; Access Management \u0130\u015flemlerini Azure AD B2C ile .NET Ortam\u0131nda Ger\u00e7ekle\u015ftirmek"},"content":{"rendered":"<p>Bildi\u011fimiz gibi bir \u00fcr\u00fcn geli\u015ftirirken olabildi\u011fince farkl\u0131 cloud \u00e7\u00f6z\u00fcmlerinden faydalanmak, harcanacak zaman ve karma\u015f\u0131kl\u0131\u011f\u0131n yan\u0131 s\u0131ra, bizlerin farkl\u0131 y\u00f6netimsel masraflardan da olabildi\u011fince ka\u00e7\u0131nabilmesini sa\u011flamaktad\u0131r.<\/p>\n<p>G\u00fcn\u00fcm\u00fczde bir \u00e7o\u011fumuz cloud-native uygulamalar geli\u015ftiriyor veya cloud&#8217;a migration&#8217;lar ger\u00e7ekle\u015ftiriyor. Bu s\u00fcre\u00e7lerde ise \u00e7e\u015fitli masraflar\u0131 minimize edebilmek i\u00e7in cloud sa\u011flay\u0131c\u0131lar\u0131n farkl\u0131 <em>PaaS<\/em>, <em>SaaS<\/em>, <em>Serverless<\/em> gibi \u00e7\u00f6z\u00fcmlerinden de olabildi\u011fince yararlanmaya \u00e7al\u0131\u015f\u0131yoruz. <strong><em>Azure Active Directory B2C<\/em><\/strong> ise <strong>consumer identity<\/strong> ve <strong>access management<\/strong> konusunda yararlanabilece\u011fimiz cloud \u00e7\u00f6z\u00fcmlerinden bir tanesi. \u00d6zellikle customer-facing bir uygulama geli\u015ftiriyorsak, g\u00fcvenli ve \u00f6l\u00e7eklenebilir bir consumer identity management \u00f6zelli\u011fine sahip olmak olduk\u00e7a \u00f6nem arz etmektedir.<\/p>\n<p><em>.NET<\/em> d\u00fcnyas\u0131nda bu tarz ihtiya\u00e7lar i\u00e7in genellikle <em>Identity Server<\/em>\u00a0configure edilerek kullan\u0131lmaktad\u0131r. Elbette di\u011fer servis&#8217;lerde de oldu\u011fu gibi identity servis&#8217;inin de g\u00fcvenli\u011fini, \u00f6l\u00e7eklenebilirli\u011fini ve hosting&#8217;ini y\u00f6netiyor olmam\u0131z gerekmektedir. \u00d6te yandan alternatif olarak <em>Azure AD B2C<\/em> kullanarak bu servis&#8217;in <strong>g\u00fcvenli\u011fini<\/strong>, <strong>\u00f6l\u00e7eklenebilirli\u011fini<\/strong>, <em>GDPR<\/em> gibi <strong>veri koruma<\/strong> y\u00f6netmeliklerine uyumlulu\u011funu ve benzeri karma\u015f\u0131kl\u0131klar\u0131 bizim yerimize <em>Azure<\/em>&#8216;un \u00fcstlenmesini sa\u011flayabilir ve do\u011frudan kendi core business&#8217;\u0131m\u0131za odaklana da biliriz.<\/p>\n<h2>Azure AD B2C<\/h2>\n<p><em>Azure<\/em>&#8216;un sunmu\u015f oldu\u011fu bu servis, consumer identity ve access management konusunda bizlere bir \u00e7ok fonksiyonalite ve <strong>esneklikler<\/strong> sunmaktad\u0131r.<\/p>\n<p><a href=\"\/wp-content\/uploads\/2023\/05\/azureadb2c-overview.png\"><img decoding=\"async\" class=\"aligncenter size-full wp-image-4384 lazyload\" data-src=\"\/wp-content\/uploads\/2023\/05\/azureadb2c-overview.png\" alt=\"\" width=\"1209\" height=\"554\" data-srcset=\"https:\/\/gokhan-gokalp.com\/wp-content\/uploads\/2023\/05\/azureadb2c-overview.png 1209w, https:\/\/gokhan-gokalp.com\/wp-content\/uploads\/2023\/05\/azureadb2c-overview-300x137.png 300w, https:\/\/gokhan-gokalp.com\/wp-content\/uploads\/2023\/05\/azureadb2c-overview-1024x469.png 1024w, https:\/\/gokhan-gokalp.com\/wp-content\/uploads\/2023\/05\/azureadb2c-overview-768x352.png 768w\" data-sizes=\"(max-width: 1209px) 100vw, 1209px\" src=\"data:image\/svg+xml;base64,PHN2ZyB3aWR0aD0iMSIgaGVpZ2h0PSIxIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciPjwvc3ZnPg==\" style=\"--smush-placeholder-width: 1209px; --smush-placeholder-aspect-ratio: 1209\/554;\" \/><\/a><\/p>\n<ul>\n<li><em>OAuth 2.0<\/em> ve <em>OpenID Connect<\/em> deste\u011fi bulunmaktad\u0131r.<\/li>\n<li>Customize edilebilir aray\u00fcz ile birlikte &#8220;sign in&#8221;, &#8220;sign up&#8221; ve &#8220;reset password&#8221; gibi farkl\u0131 fonksiyonaliteler de sa\u011flamaktad\u0131r.<\/li>\n<li>Built-in threat detection ve multi-factor authentication sa\u011flamaktad\u0131r.<\/li>\n<li>Farkl\u0131 identity provider&#8217;lar\u0131 ile entegrasyonu bulunmaktad\u0131r.<\/li>\n<li>Customize edilebilir attribute yap\u0131s\u0131na izin vermektedir. Yani ihtiya\u00e7lar\u0131m\u0131z do\u011frultusunda diledi\u011fimiz user-specific attribute&#8217;lere sahip olabiliriz.<\/li>\n<\/ul>\n<p>\u015eimdi daha konuyu iyi anlayabilmek ad\u0131na, <em>Azure AD B2C<\/em> ile basit bir \u00f6rnek ger\u00e7ekle\u015ftirelim.<\/p>\n<h2>Bir Azure AD B2C Tenant&#8217;\u0131 Olu\u015ftural\u0131m<\/h2>\n<p><em>Azure AD B2C<\/em> kullanabilmemiz i\u00e7in \u00f6ncelikle bir tenant olu\u015fturmam\u0131z gerekmektedir. Tenant&#8217;\u0131 bir organization&#8217;a ait olan t\u00fcm kullan\u0131c\u0131 bilgilerini, uygulama ve <em>API<\/em> kay\u0131tlar\u0131n\u0131 ve policy gibi \u00e7e\u015fitli resource&#8217;lar\u0131n\u0131 bar\u0131nd\u0131ran isolated bir container olarak d\u00fc\u015f\u00fcnebiliriz.<\/p>\n<p>\u00d6ncelikle bir tenant olu\u015fturabilmek i\u00e7in <a href=\"https:\/\/learn.microsoft.com\/en-us\/azure\/active-directory-b2c\/tutorial-create-tenant#create-an-azure-ad-b2c-tenant\" target=\"_blank\" rel=\"noopener\"><em>buradaki<\/em><\/a> ad\u0131mlar\u0131 takip edelim. Ben &#8220;<em>MyTodo<\/em>&#8221; ad\u0131nda bir organization olu\u015fturdum. Tenant&#8217;\u0131 olu\u015fturduktan sonra ise kullanmaya ba\u015flayabilmek i\u00e7in ilgili tenant&#8217;\u0131 i\u00e7eren directory&#8217;e ge\u00e7i\u015f yapmam\u0131z gerekmektedir. Bunun i\u00e7in <em>Azure<\/em> portal \u00fczerinden &#8220;<em>Directories + subscriptions<\/em>&#8221; b\u00f6l\u00fcm\u00fcne gidelim ve olu\u015fturmu\u015f oldu\u011fumuz directory&#8217;e ge\u00e7i\u015f i\u015flemini ger\u00e7ekle\u015ftirelim.<\/p>\n<p><a href=\"\/wp-content\/uploads\/2023\/06\/mytodoorg.jpg\"><img decoding=\"async\" class=\"aligncenter size-full wp-image-4389 lazyload\" data-src=\"\/wp-content\/uploads\/2023\/06\/mytodoorg.jpg\" alt=\"\" width=\"1160\" height=\"456\" data-srcset=\"https:\/\/gokhan-gokalp.com\/wp-content\/uploads\/2023\/06\/mytodoorg.jpg 1160w, https:\/\/gokhan-gokalp.com\/wp-content\/uploads\/2023\/06\/mytodoorg-300x118.jpg 300w, https:\/\/gokhan-gokalp.com\/wp-content\/uploads\/2023\/06\/mytodoorg-1024x403.jpg 1024w, https:\/\/gokhan-gokalp.com\/wp-content\/uploads\/2023\/06\/mytodoorg-768x302.jpg 768w\" data-sizes=\"(max-width: 1160px) 100vw, 1160px\" src=\"data:image\/svg+xml;base64,PHN2ZyB3aWR0aD0iMSIgaGVpZ2h0PSIxIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciPjwvc3ZnPg==\" style=\"--smush-placeholder-width: 1160px; --smush-placeholder-aspect-ratio: 1160\/456;\" \/><\/a><\/p>\n<p>Ge\u00e7i\u015f i\u015flemini ger\u00e7ekle\u015ftirdikten sonra art\u0131k identity access i\u015flemleri i\u00e7in <em>Azure AD B2C<\/em>&#8216;yi configure etmeye ba\u015flayabiliriz.<\/p>\n<p><em>Azure AD B2C<\/em> i\u00e7erisinde consumer identity ve access management i\u015flemleri i\u00e7in kullan\u0131c\u0131lar\u0131n takip etmeleri gereken \u00e7e\u015fitli business logic&#8217;ler tan\u0131mlayabilmekteyiz. Bu i\u015flemleri ise iki farkl\u0131 \u015fekilde ger\u00e7ekle\u015ftirebilmekteyiz. E\u011fer kompleks bir s\u00fcrecimiz yoksa, \u00f6rne\u011fin <em>REST<\/em> \u00e7a\u011fr\u0131lar\u0131 yapmay\u0131 gerektiren i\u015flemler gibi, hali haz\u0131rda sunulmu\u015f olan user flow&#8217;lar\u0131 h\u0131zl\u0131ca kullanmaya ba\u015flayabiliriz. E\u011fer kompleks bir s\u00fcrece sahipsek ve policy-driven bir yakla\u015f\u0131ma ihtiyac\u0131m\u0131z varsa, ozaman kendi custom <em>XML<\/em>-based policy&#8217;lerimizi tan\u0131mlamam\u0131z gerekmektedir.<\/p>\n<figure id=\"attachment_4392\" aria-describedby=\"caption-attachment-4392\" style=\"width: 1551px\" class=\"wp-caption aligncenter\"><a href=\"\/wp-content\/uploads\/2023\/06\/user-flow-vs-custom-policy.png\"><img decoding=\"async\" class=\"wp-image-4392 size-full lazyload\" data-src=\"\/wp-content\/uploads\/2023\/06\/user-flow-vs-custom-policy.png\" alt=\"\" width=\"1551\" height=\"606\" data-srcset=\"https:\/\/gokhan-gokalp.com\/wp-content\/uploads\/2023\/06\/user-flow-vs-custom-policy.png 1551w, https:\/\/gokhan-gokalp.com\/wp-content\/uploads\/2023\/06\/user-flow-vs-custom-policy-300x117.png 300w, https:\/\/gokhan-gokalp.com\/wp-content\/uploads\/2023\/06\/user-flow-vs-custom-policy-1024x400.png 1024w, https:\/\/gokhan-gokalp.com\/wp-content\/uploads\/2023\/06\/user-flow-vs-custom-policy-768x300.png 768w, https:\/\/gokhan-gokalp.com\/wp-content\/uploads\/2023\/06\/user-flow-vs-custom-policy-1536x600.png 1536w\" data-sizes=\"(max-width: 1551px) 100vw, 1551px\" src=\"data:image\/svg+xml;base64,PHN2ZyB3aWR0aD0iMSIgaGVpZ2h0PSIxIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciPjwvc3ZnPg==\" style=\"--smush-placeholder-width: 1551px; --smush-placeholder-aspect-ratio: 1551\/606;\" \/><\/a><figcaption id=\"caption-attachment-4392\" class=\"wp-caption-text\">https:\/\/learn.microsoft.com\/en-us\/azure\/active-directory-b2c\/user-flow-overview<\/figcaption><\/figure>\n<p>Bu makale kapsam\u0131nda ise predefined sunulan user flow&#8217;lar\u0131 nas\u0131l kullanabilece\u011fimize bir bakaca\u011f\u0131z. Predefined sunulan user flow&#8217;lar ile consumer identity ve access management ad\u0131na ihtiyac\u0131m\u0131z olacak olan bir \u00e7ok i\u015femleri kolayl\u0131kla ve h\u0131zl\u0131 bir \u015fekilde ger\u00e7ekle\u015ftirebilmekteyiz.<\/p>\n<p><strong>Bu i\u015flemlerin baz\u0131lar\u0131<\/strong>;<\/p>\n<ul>\n<li>Sign-in i\u015flemleri i\u00e7in kullan\u0131l\u0131cak account type&#8217;\u0131n\u0131 belirleyebilmekteyiz (social accounts veya local accounts gibi)<\/li>\n<li>Kullan\u0131c\u0131dan alaca\u011f\u0131m\u0131z attribute&#8217;lere karar verebiliriz<\/li>\n<li><em>MFA<\/em> kullanabilmekteyiz<\/li>\n<li>Token i\u00e7erisinde ihtiya\u00e7 duyaca\u011f\u0131m\u0131z claim&#8217;leri d\u00fczenleyebiliriz<\/li>\n<li><em>UI<\/em>&#8216;\u0131 markam\u0131za g\u00f6re customize edebiliriz<\/li>\n<\/ul>\n<p>G\u00f6rd\u00fc\u011f\u00fcm\u00fcz gibi ihtiyac\u0131m\u0131z olabilecek standart bir \u00e7ok \u00f6zellik user flow&#8217;lar ile esnek bir \u015fekilde bizlere sa\u011flanmaktad\u0131r.<\/p>\n<h3>User Flow Olu\u015ftural\u0131m<\/h3>\n<p>\u015eimdi h\u0131zl\u0131ca ilk user flow&#8217;u tan\u0131mlayal\u0131m. Bunun i\u00e7in olu\u015fturmu\u015f oldu\u011fumuz <em>Azure AD B2C<\/em> instance&#8217;\u0131na gidelim ve &#8220;<em>Policies<\/em>&#8221; men\u00fcs\u00fc alt\u0131nda bulunan &#8220;<em>User flows<\/em>&#8221; a t\u0131klayal\u0131m. Ard\u0131ndan &#8220;<em>New user flow<\/em>&#8221; a t\u0131klayarak &#8220;<em>Sign up and sign in<\/em>&#8221; se\u00e7ene\u011fini se\u00e7elim. \u0130sminden de anla\u015f\u0131labilece\u011fi \u00fczere kullan\u0131c\u0131lar\u0131n sistemimize \u00fcye olup, giri\u015f yapabilecekleri flow&#8217;u configure edece\u011fiz. &#8220;<em>Version<\/em>&#8221; olarak ise recommended olan\u0131 se\u00e7elim ve flow&#8217;u a\u015fa\u011f\u0131daki gibi configure edelim. Ard\u0131ndan olu\u015fturacak oldu\u011fumuz flow&#8217;un ismini, daha sonra kullanmak \u00fczere not alal\u0131m.<\/p>\n<p><a href=\"\/wp-content\/uploads\/2023\/06\/createuserflow.jpg\"><img decoding=\"async\" class=\"aligncenter size-full wp-image-4393 lazyload\" data-src=\"\/wp-content\/uploads\/2023\/06\/createuserflow.jpg\" alt=\"\" width=\"1380\" height=\"909\" data-srcset=\"https:\/\/gokhan-gokalp.com\/wp-content\/uploads\/2023\/06\/createuserflow.jpg 1380w, https:\/\/gokhan-gokalp.com\/wp-content\/uploads\/2023\/06\/createuserflow-300x198.jpg 300w, https:\/\/gokhan-gokalp.com\/wp-content\/uploads\/2023\/06\/createuserflow-1024x675.jpg 1024w, https:\/\/gokhan-gokalp.com\/wp-content\/uploads\/2023\/06\/createuserflow-768x506.jpg 768w\" data-sizes=\"(max-width: 1380px) 100vw, 1380px\" src=\"data:image\/svg+xml;base64,PHN2ZyB3aWR0aD0iMSIgaGVpZ2h0PSIxIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciPjwvc3ZnPg==\" style=\"--smush-placeholder-width: 1380px; --smush-placeholder-aspect-ratio: 1380\/909;\" \/><\/a><\/p>\n<p>Burada g\u00f6rd\u00fc\u011f\u00fcm\u00fcz gibi <em>MFA<\/em>&#8216;\u0131 etkinle\u015ftirebilmekte ve kullan\u0131c\u0131dan almak istedi\u011fimiz bilgileri ve token i\u00e7erisinde claim olarak saklamak istedi\u011fimiz bilgileri configure edebilmekteyiz. Ayr\u0131ca flow olu\u015fturulduktan sonra da farkl\u0131 configuration&#8217;lar ger\u00e7ekle\u015ftirebilmekteyiz.<\/p>\n<p><a href=\"\/wp-content\/uploads\/2023\/06\/userflowedit.jpg\"><img decoding=\"async\" class=\"aligncenter size-full wp-image-4394 lazyload\" data-src=\"\/wp-content\/uploads\/2023\/06\/userflowedit.jpg\" alt=\"\" width=\"1131\" height=\"708\" data-srcset=\"https:\/\/gokhan-gokalp.com\/wp-content\/uploads\/2023\/06\/userflowedit.jpg 1131w, https:\/\/gokhan-gokalp.com\/wp-content\/uploads\/2023\/06\/userflowedit-300x188.jpg 300w, https:\/\/gokhan-gokalp.com\/wp-content\/uploads\/2023\/06\/userflowedit-1024x641.jpg 1024w, https:\/\/gokhan-gokalp.com\/wp-content\/uploads\/2023\/06\/userflowedit-768x481.jpg 768w\" data-sizes=\"(max-width: 1131px) 100vw, 1131px\" src=\"data:image\/svg+xml;base64,PHN2ZyB3aWR0aD0iMSIgaGVpZ2h0PSIxIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciPjwvc3ZnPg==\" style=\"--smush-placeholder-width: 1131px; --smush-placeholder-aspect-ratio: 1131\/708;\" \/><\/a>\u00d6rne\u011fin attribute&#8217;leri de\u011fi\u015ftirebilir, \u00e7e\u015fitli a\u015famalarda \u00e7a\u011fr\u0131lmak \u00fczere <em>API<\/em> connector&#8217;leri ekleyebilir veya <em>UI<\/em> layout&#8217;unu de\u011fi\u015ftirebiliriz.<\/p>\n<h3>\u00d6rnek Bir Proje Olu\u015ftural\u0131m<\/h3>\n<h4><strong>Web App \u0130le Ba\u015flayal\u0131m<\/strong><\/h4>\n<p>Customer-facing bir <em>Web App <\/em>geli\u015ftirece\u011fimizi d\u00fc\u015f\u00fcnelim ve geli\u015ftirme s\u00fcrecini basitle\u015ftirebilmek ve h\u0131zland\u0131rabilmek ad\u0131na identity access ve management i\u015flemlerini <em>Azure AD B2C<\/em>&#8216;ye delege etmek istedi\u011fimizi varsayal\u0131m. Ayr\u0131ca bu <em>Web App<\/em>&#8216;in arka planda bir <em>Web API<\/em>&#8216;\u0131 da g\u00fcvenli bir \u015fekilde consume etmesini istedi\u011fimizi d\u00fc\u015f\u00fcnelim.<\/p>\n<p>\u0130lk olarak a\u015fa\u011f\u0131daki komut sat\u0131r\u0131 ile <em>MyTodoOrgWeb<\/em> ad\u0131nda bir <em>.NET 7<\/em> <em>Web App<\/em> projesi olu\u015ftural\u0131m.<\/p>\n<pre class=\"p1\"><span class=\"s1\">dotnet new webapp -n <em>MyTodoOrgWeb<\/em> --auth IndividualB2C<\/span><\/pre>\n<p>Burada &#8220;<em>auth<\/em>&#8221; opsiyonunu &#8220;<em>IndividualB2C<\/em>&#8221; olarak belirtti\u011fimiz i\u00e7in, .<em>NET CLI<\/em> <em>Azure AD B2C<\/em>&#8216;yi kullanabilmemiz i\u00e7in gerekli olan template&#8217;i &#8220;<em>OpenID Connect<\/em>&#8221; configuration&#8217;\u0131 ile birlikte bizim i\u00e7in otomatik olarak olu\u015fturmaktad\u0131r.<\/p>\n<p>\u015eimdi bu projeyi configure etmeden \u00f6nce, ilk olarak onu olu\u015fturmu\u015f oldu\u011fumuz tenant i\u00e7erisinde tan\u0131mlamam\u0131z gerekmektedir. B\u00f6ylece authentication i\u015flemlerini <em>Azure AD B2C<\/em> ile ger\u00e7ekle\u015ftirebilece\u011fiz. Bunun i\u00e7in <em>Azure AD B2C<\/em> instance&#8217;\u0131na gidelim ve sol men\u00fcden &#8220;<em>App registration<\/em>&#8221; sekmesini se\u00e7elim. Ard\u0131ndan &#8220;<em>New registration<\/em>&#8221; a t\u0131klayarak a\u015fa\u011f\u0131daki gibi tan\u0131mlama i\u015flemini yapal\u0131m.<\/p>\n<p><a href=\"\/wp-content\/uploads\/2023\/09\/mytodoorgweb-app-register.jpg\"><img decoding=\"async\" class=\"aligncenter size-full wp-image-4401 lazyload\" data-src=\"\/wp-content\/uploads\/2023\/09\/mytodoorgweb-app-register.jpg\" alt=\"\" width=\"2092\" height=\"1248\" data-srcset=\"https:\/\/gokhan-gokalp.com\/wp-content\/uploads\/2023\/09\/mytodoorgweb-app-register.jpg 2092w, https:\/\/gokhan-gokalp.com\/wp-content\/uploads\/2023\/09\/mytodoorgweb-app-register-300x179.jpg 300w, https:\/\/gokhan-gokalp.com\/wp-content\/uploads\/2023\/09\/mytodoorgweb-app-register-1024x611.jpg 1024w, https:\/\/gokhan-gokalp.com\/wp-content\/uploads\/2023\/09\/mytodoorgweb-app-register-768x458.jpg 768w, https:\/\/gokhan-gokalp.com\/wp-content\/uploads\/2023\/09\/mytodoorgweb-app-register-1536x916.jpg 1536w, https:\/\/gokhan-gokalp.com\/wp-content\/uploads\/2023\/09\/mytodoorgweb-app-register-2048x1222.jpg 2048w\" data-sizes=\"(max-width: 2092px) 100vw, 2092px\" src=\"data:image\/svg+xml;base64,PHN2ZyB3aWR0aD0iMSIgaGVpZ2h0PSIxIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciPjwvc3ZnPg==\" style=\"--smush-placeholder-width: 2092px; --smush-placeholder-aspect-ratio: 2092\/1248;\" \/><\/a><\/p>\n<p>\u0130sim olarak buraya &#8220;<em>MyTodoOrgWeb<\/em>&#8221; verelim ve &#8220;<em>Supported account types<\/em>&#8221; se\u00e7ene\u011fini de sonuncu olan se\u00e7ene\u011fi se\u00e7elim. &#8220;<em>Redirect URI<\/em>&#8221; olarak ise <em>.NET CLI<\/em> ile olu\u015fturmu\u015f oldu\u011fumuz \u00f6rnek proje template&#8217;i i\u00e7erisinde de default olarak gelen, &#8220;<em>signin-oidc<\/em>&#8221; callback adresini belirtelim.<\/p>\n<p>App registration i\u015flemini tamamlad\u0131ktan sonra ise &#8220;<em>Authentication<\/em>&#8221; tab&#8217;\u0131na gidelim ve <em>OpenID Connect <\/em>ile sign in i\u015flemini h\u0131zl\u0131 bir \u015fekilde ger\u00e7ekle\u015ftirebilmek i\u00e7in \u015fimdilik implicit grant flow&#8217;u &#8220;<em>Access tokens<\/em>&#8221; ve &#8220;<em>ID tokens<\/em>&#8221; se\u00e7eneklerini se\u00e7erek etkinle\u015ftirelim. Daha sonra bir <em>Web API<\/em> \u00e7a\u011f\u0131rma a\u015famas\u0131na ge\u00e7ti\u011fimizde ise implicit grant flow&#8217;u kapatarak, daha secure olabilmesi a\u00e7\u0131s\u0131ndan <strong>authorization code flow<\/strong>&#8216;u etkinle\u015ftiriyor olaca\u011f\u0131z. \u00c7\u00fcnk\u00fc implicit grant flow&#8217;da ilgili token&#8217;lar redirect&#8217;ler s\u0131ras\u0131nda <em>URL <\/em>&#8216;lerin query parametreleri i\u00e7erisinde iletildi\u011fi i\u00e7in, kolayl\u0131kla intercept edilebilme riskleri bulunmaktad\u0131r.<\/p>\n<p><a href=\"\/wp-content\/uploads\/2023\/10\/imp_grant_b2c.jpg\"><img decoding=\"async\" class=\"aligncenter wp-image-4423 size-full lazyload\" data-src=\"\/wp-content\/uploads\/2023\/10\/imp_grant_b2c.jpg\" alt=\"\" width=\"2152\" height=\"848\" data-srcset=\"https:\/\/gokhan-gokalp.com\/wp-content\/uploads\/2023\/10\/imp_grant_b2c.jpg 2152w, https:\/\/gokhan-gokalp.com\/wp-content\/uploads\/2023\/10\/imp_grant_b2c-300x118.jpg 300w, https:\/\/gokhan-gokalp.com\/wp-content\/uploads\/2023\/10\/imp_grant_b2c-1024x404.jpg 1024w, https:\/\/gokhan-gokalp.com\/wp-content\/uploads\/2023\/10\/imp_grant_b2c-768x303.jpg 768w, https:\/\/gokhan-gokalp.com\/wp-content\/uploads\/2023\/10\/imp_grant_b2c-1536x605.jpg 1536w, https:\/\/gokhan-gokalp.com\/wp-content\/uploads\/2023\/10\/imp_grant_b2c-2048x807.jpg 2048w\" data-sizes=\"(max-width: 2152px) 100vw, 2152px\" src=\"data:image\/svg+xml;base64,PHN2ZyB3aWR0aD0iMSIgaGVpZ2h0PSIxIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciPjwvc3ZnPg==\" style=\"--smush-placeholder-width: 2152px; --smush-placeholder-aspect-ratio: 2152\/848;\" \/><\/a><\/p>\n<p>Ard\u0131ndan &#8220;<em>Certificates &amp; secrets<\/em>&#8221; tab&#8217;\u0131na giderek \u015fimdiden\u00a0bir client secret tan\u0131mlayal\u0131m. Bu secret &#8220;<em>MyTodoOrgWeb<\/em>&#8221; &#8216;in bir sonraki a\u015famada olu\u015fturacak oldu\u011fumuz <em>Web API <\/em>&#8216;\u0131 g\u00fcvenli bir \u015fekilde consume edebilmesi i\u00e7in kullan\u0131lacak.<\/p>\n<p>\u015eimdi ufak bir test yapabiliriz.<\/p>\n<p>\u00d6ncelikle &#8220;<em>MyTodoOrgWeb<\/em>&#8221; uygulamas\u0131n\u0131n &#8220;<em>appsettings.json<\/em>&#8221; dosyas\u0131n\u0131 a\u015fa\u011f\u0131daki gibi olu\u015fturmu\u015f oldu\u011fumuz bilgiler do\u011frultusunda g\u00fcncelleyelim.<\/p>\n<pre>{\n  \"AzureAdB2C\": {\n    \"Instance\": \"https:\/\/YOUR_ORGANIZATION.b2clogin.com\/\",\n    \"ClientId\": \"CLIENT_ID\",\n    \"CallbackPath\": \"\/signin-oidc\",\n    \"Domain\": \"YOUR_ORGANIZATION.onmicrosoft.com\",\n    \"SignedOutCallbackPath\": \"\/signout\/B2C_1_CreateUserFlow\",\n    \"SignUpSignInPolicyId\": \"B2C_1_CreateUserFlow\",\n    \"ClientSecret\": \"YOUR_CLIENT_SECRET\"\n  },\n  \"Logging\": {\n    \"LogLevel\": {\n      \"Default\": \"Information\",\n      \"Microsoft.AspNetCore\": \"Warning\"\n    }\n  },\n  \"AllowedHosts\": \"*\"\n}<\/pre>\n<p>Ard\u0131ndan &#8220;<em>MyTodoOrgWeb<\/em>&#8221; uygulamas\u0131n\u0131 \u00e7al\u0131\u015ft\u0131ral\u0131m ve &#8220;<em>Sign in<\/em>&#8221; butonuna basal\u0131m.<\/p>\n<p>Bu noktada bizi y\u00f6nlendirmi\u015f oldu\u011fu &#8220;<em>Sign up and sign in<\/em>&#8221; <em>user flow <\/em>unun\u00a0<em>URL<\/em> &#8216;i i\u00e7erisine bakarsak, &#8220;<em>response_type=id_token<\/em>&#8221; query parametresinin set edildi\u011fini g\u00f6rebiliriz. Yani burada sign in i\u015flemi sonucunda bir &#8220;<em>id_token<\/em>&#8221; elde ediyor olaca\u011f\u0131z.<\/p>\n<p><a href=\"\/wp-content\/uploads\/2023\/10\/user_details.jpg\"><img decoding=\"async\" class=\"aligncenter size-full wp-image-4409 lazyload\" data-src=\"\/wp-content\/uploads\/2023\/10\/user_details.jpg\" alt=\"\" width=\"2098\" height=\"1480\" data-srcset=\"https:\/\/gokhan-gokalp.com\/wp-content\/uploads\/2023\/10\/user_details.jpg 2098w, https:\/\/gokhan-gokalp.com\/wp-content\/uploads\/2023\/10\/user_details-300x212.jpg 300w, https:\/\/gokhan-gokalp.com\/wp-content\/uploads\/2023\/10\/user_details-1024x722.jpg 1024w, https:\/\/gokhan-gokalp.com\/wp-content\/uploads\/2023\/10\/user_details-768x542.jpg 768w, https:\/\/gokhan-gokalp.com\/wp-content\/uploads\/2023\/10\/user_details-1536x1084.jpg 1536w, https:\/\/gokhan-gokalp.com\/wp-content\/uploads\/2023\/10\/user_details-2048x1445.jpg 2048w\" data-sizes=\"(max-width: 2098px) 100vw, 2098px\" src=\"data:image\/svg+xml;base64,PHN2ZyB3aWR0aD0iMSIgaGVpZ2h0PSIxIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciPjwvc3ZnPg==\" style=\"--smush-placeholder-width: 2098px; --smush-placeholder-aspect-ratio: 2098\/1480;\" \/><\/a><\/p>\n<p>G\u00f6rd\u00fc\u011f\u00fcm\u00fcz .<em>NET CLI<\/em> ile olu\u015fturmu\u015f oldu\u011fumuz <em>Web App<\/em> template&#8217;i\u00a0ve <em>Azure AD B2C <\/em>user flow&#8217;lar\u0131 sayesinde kolay ve h\u0131zl\u0131 bir \u015fekilde sign up ve sign in i\u015flemlerini ger\u00e7ekle\u015ftirebilen bir yap\u0131ya sahip olduk.<\/p>\n<p>\u015eimdi ise bu <em>Web App<\/em> \u00fczerinden <em>Azure AD B2C<\/em> ile g\u00fcvenli bir hale getirilmi\u015f (getirece\u011fimiz) bir <em>Web API <\/em>&#8216;a nas\u0131l eri\u015fim sa\u011flayabiliriz bir ona bakal\u0131m.<\/p>\n<h4><strong>Web API Olu\u015ftural\u0131m<\/strong><\/h4>\n<p>Yine <em>.NET CLI <\/em>&#8216;\u0131 kullanarak &#8220;<em>MyTodoOrgAPI<\/em>&#8221; ad\u0131nda \u00f6rnek bir <em>.NET 7<\/em> <em>Web API <\/em>projesi\u00a0olu\u015ftural\u0131m.<\/p>\n<pre><span class=\"s1\">dotnet new webapi -n <em>MyTodoOrgAPI<\/em> --auth IndividualB2C<\/span><\/pre>\n<p><em>.NET CLI<\/em> bize yine authentication ve authorization i\u015flemleri i\u00e7in <em>Azure AD B2C <\/em>kullanan bir <em>API<\/em> template&#8217;i olu\u015fturacakt\u0131r.<\/p>\n<p>Ard\u0131ndan daha \u00f6nce yapt\u0131\u011f\u0131m\u0131z gibi projenin configuration i\u015flemine ba\u015flamadan \u00f6nce tenant i\u00e7erisinde tan\u0131mlama i\u015flemini ger\u00e7ekle\u015ftirelim.<\/p>\n<p><a href=\"\/wp-content\/uploads\/2023\/10\/mytodoorgapiappregister.jpg\"><img decoding=\"async\" class=\"aligncenter size-full wp-image-4411 lazyload\" data-src=\"\/wp-content\/uploads\/2023\/10\/mytodoorgapiappregister.jpg\" alt=\"\" width=\"1840\" height=\"1458\" data-srcset=\"https:\/\/gokhan-gokalp.com\/wp-content\/uploads\/2023\/10\/mytodoorgapiappregister.jpg 1840w, https:\/\/gokhan-gokalp.com\/wp-content\/uploads\/2023\/10\/mytodoorgapiappregister-300x238.jpg 300w, https:\/\/gokhan-gokalp.com\/wp-content\/uploads\/2023\/10\/mytodoorgapiappregister-1024x811.jpg 1024w, https:\/\/gokhan-gokalp.com\/wp-content\/uploads\/2023\/10\/mytodoorgapiappregister-768x609.jpg 768w, https:\/\/gokhan-gokalp.com\/wp-content\/uploads\/2023\/10\/mytodoorgapiappregister-1536x1217.jpg 1536w\" data-sizes=\"(max-width: 1840px) 100vw, 1840px\" src=\"data:image\/svg+xml;base64,PHN2ZyB3aWR0aD0iMSIgaGVpZ2h0PSIxIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciPjwvc3ZnPg==\" style=\"--smush-placeholder-width: 1840px; --smush-placeholder-aspect-ratio: 1840\/1458;\" \/><\/a><\/p>\n<p>Bu sefer &#8220;<em>Supported account types<\/em>&#8221; olarak &#8220;<em>Accounts in this organizational directory only&#8230;<\/em>&#8221; se\u00e7ene\u011fini se\u00e7elim.<\/p>\n<p>App registration i\u015flemini tamamlad\u0131ktan sonra ise \u015fimdi bu <em>API<\/em> \u00fczerinde fine-grained bir access kontrole sahip olabilmemiz i\u00e7in, scope&#8217;lardan yararlanaca\u011f\u0131z. Scope&#8217;lar sayesinde bir<em>\u00a0API <\/em>&#8216;\u0131n farkl\u0131 endpoint&#8217;lerine veya fonksiyonalitelerini olan eri\u015fimi, <strong>client&#8217;lar<\/strong> baz\u0131nda s\u0131n\u0131rlayabilmekteyiz.<\/p>\n<p>Bunun i\u00e7in \u00f6ncelikle &#8220;<em>Expose an API<\/em>&#8221; tab&#8217;\u0131na ge\u00e7elim ve scope&#8217;lar i\u00e7in prefix olarak kullan\u0131lacak olan &#8220;<em>Application ID URI<\/em>&#8221; bilgisini d\u00fczenleyelim. Ben &#8220;<em>mytodoorgapi<\/em>&#8221; de\u011ferini verdim. Ard\u0131ndan &#8220;<em>Add a scope<\/em>&#8221; butonuna basal\u0131m ve a\u015fa\u011f\u0131daki gibi &#8220;<em>read<\/em>&#8221; ad\u0131nda \u00f6rnek bir scope ekleyelim.<\/p>\n<p><a href=\"\/wp-content\/uploads\/2023\/10\/add_scope_2_api.jpg\"><img decoding=\"async\" class=\"aligncenter size-full wp-image-4412 lazyload\" data-src=\"\/wp-content\/uploads\/2023\/10\/add_scope_2_api.jpg\" alt=\"\" width=\"2188\" height=\"1116\" data-srcset=\"https:\/\/gokhan-gokalp.com\/wp-content\/uploads\/2023\/10\/add_scope_2_api.jpg 2188w, https:\/\/gokhan-gokalp.com\/wp-content\/uploads\/2023\/10\/add_scope_2_api-300x153.jpg 300w, https:\/\/gokhan-gokalp.com\/wp-content\/uploads\/2023\/10\/add_scope_2_api-1024x522.jpg 1024w, https:\/\/gokhan-gokalp.com\/wp-content\/uploads\/2023\/10\/add_scope_2_api-768x392.jpg 768w, https:\/\/gokhan-gokalp.com\/wp-content\/uploads\/2023\/10\/add_scope_2_api-1536x783.jpg 1536w, https:\/\/gokhan-gokalp.com\/wp-content\/uploads\/2023\/10\/add_scope_2_api-2048x1045.jpg 2048w\" data-sizes=\"(max-width: 2188px) 100vw, 2188px\" src=\"data:image\/svg+xml;base64,PHN2ZyB3aWR0aD0iMSIgaGVpZ2h0PSIxIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciPjwvc3ZnPg==\" style=\"--smush-placeholder-width: 2188px; --smush-placeholder-aspect-ratio: 2188\/1116;\" \/><\/a><\/p>\n<p>K\u0131saca bu <em>API<\/em> &#8216;\u0131\u00a0kullan\u0131c\u0131 ad\u0131na \u00e7a\u011f\u0131racak olan client&#8217;\u0131n, &#8220;<em>read<\/em>&#8221; scope&#8217;una sahip olmas\u0131 beklenecektir.<\/p>\n<p>Dolay\u0131s\u0131yla &#8220;<em>MyTodoOrgWeb<\/em>&#8221; &#8216;in &#8220;<em>MyTodoOrgAPI<\/em>&#8221; &#8216;\u0131na eri\u015fim sa\u011flayabilmesi i\u00e7in, tan\u0131mlam\u0131\u015f oldu\u011fumuz bu scope&#8217;a eri\u015fim iznini vermemiz gerekmektedir. Bunun i\u00e7in <em>Azure AD B2C<\/em> \u00fczerinden &#8220;<em>MyTodoOrgWeb<\/em>&#8221; uygulamas\u0131na gidelim ve &#8220;<em>API permissions<\/em>&#8221; tab&#8217;\u0131na ge\u00e7elim. Ard\u0131ndan &#8220;<em>Add permission<\/em>&#8221; butonuna t\u0131klayal\u0131m ve &#8220;<em>APIs my organization uses<\/em>&#8221; sekmesi alt\u0131ndan tan\u0131mlam\u0131\u015f oldu\u011fumuz <em>API<\/em> &#8216;\u0131 bularak &#8220;<em>read<\/em>&#8221; scope&#8217;unu se\u00e7elim.<\/p>\n<p>&#8220;<em>Read<\/em>&#8221; scope&#8217;u i\u00e7in eri\u015fim iznini ekledikten sonra ise, son olarak &#8220;<em>Admin consent<\/em>&#8221; &#8216;i vermemiz gerekmektedir. K\u0131sacas\u0131 &#8220;<em>MyTodoOrgWeb<\/em>&#8221; &#8216;in &#8220;<em>MyTodoOrgAPI<\/em>&#8221; &#8216;\u0131na do\u011frudan eri\u015febilmesi i\u00e7in, &#8220;<em>Admin consent<\/em>&#8221; &#8216;i verme i\u015flemi ger\u00e7ekle\u015ftirmemiz gerekmektedir.<\/p>\n<p><a href=\"\/wp-content\/uploads\/2023\/10\/admin_consent.jpg\"><img decoding=\"async\" class=\"aligncenter size-full wp-image-4414 lazyload\" data-src=\"\/wp-content\/uploads\/2023\/10\/admin_consent.jpg\" alt=\"\" width=\"1814\" height=\"650\" data-srcset=\"https:\/\/gokhan-gokalp.com\/wp-content\/uploads\/2023\/10\/admin_consent.jpg 1814w, https:\/\/gokhan-gokalp.com\/wp-content\/uploads\/2023\/10\/admin_consent-300x107.jpg 300w, https:\/\/gokhan-gokalp.com\/wp-content\/uploads\/2023\/10\/admin_consent-1024x367.jpg 1024w, https:\/\/gokhan-gokalp.com\/wp-content\/uploads\/2023\/10\/admin_consent-768x275.jpg 768w, https:\/\/gokhan-gokalp.com\/wp-content\/uploads\/2023\/10\/admin_consent-1536x550.jpg 1536w\" data-sizes=\"(max-width: 1814px) 100vw, 1814px\" src=\"data:image\/svg+xml;base64,PHN2ZyB3aWR0aD0iMSIgaGVpZ2h0PSIxIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciPjwvc3ZnPg==\" style=\"--smush-placeholder-width: 1814px; --smush-placeholder-aspect-ratio: 1814\/650;\" \/><\/a><\/p>\n<p>Bu noktadan itibaren <em>Azure AD B2C<\/em> \u00fczerindeki configuration i\u015flemlerini her iki uygulama i\u00e7inde tamamlam\u0131\u015f olduk.<\/p>\n<p>\u015eimdi ilk olarak &#8220;<em>MyTodoOrgAPI<\/em>&#8221; &#8216;\u0131n kod taraf\u0131ndaki d\u00fczenlemelerini ger\u00e7ekle\u015ftirelim. Template ile default gelen &#8220;<em>WeatherForecast<\/em>&#8221; \u00f6rne\u011fini oldu\u011fu gibi kullanal\u0131m. Sadece controller i\u00e7erisindeki &#8220;<em>Route<\/em>&#8221; ve &#8220;<em>RequiredScope<\/em>&#8221; attribute&#8217;lerini explicit bir \u015fekilde a\u015fa\u011f\u0131daki gibi g\u00fcncelleyelim.<\/p>\n<div>\n<pre>[Route(\"weatherforecasts\")]\n[RequiredScope(\"read\")]<\/pre>\n<\/div>\n<p>B\u00f6ylece &#8220;<em>read<\/em>&#8221; scope&#8217;una sahip olan bir client, bu controller alt\u0131ndaki endpoint&#8217;lere eri\u015fim sa\u011flayabilecektir. &#8220;<em>Program.cs<\/em>&#8221; i\u00e7erisine bakt\u0131\u011f\u0131m\u0131zda da zaten <em>API<\/em> &#8216;\u0131n authentication middleware&#8217;i ile haz\u0131r bir \u015fekilde geldi\u011fini g\u00f6rebiliriz.<\/p>\n<p>Ard\u0131ndan <em>API<\/em> &#8216;\u0131n da &#8220;<em>appsettings.json<\/em>&#8221; configuration dosyas\u0131n\u0131 daha \u00f6nce olu\u015fturmu\u015f oldu\u011fumuz bilgiler do\u011frultusunda g\u00fcncelleyelim.<\/p>\n<pre>{\n  \"AzureAdB2C\": {\n    \"Instance\": \"https:\/\/YOUR_ORGANIZATION.b2clogin.com\/\",\n    \"ClientId\": \"CLIENT_ID\",\n    \"Domain\": \"YOUR_ORGANIZATION.onmicrosoft.com\",\n    \"Scopes\": \"read\",\n    \"SignUpSignInPolicyId\": \"B2C_1_CreateUserFlow\"\n  },\n  \"Logging\": {\n    \"LogLevel\": {\n      \"Default\": \"Information\",\n      \"Microsoft.AspNetCore\": \"Warning\"\n    }\n  },\n  \"AllowedHosts\": \"*\"\n}\n<\/pre>\n<p>Art\u0131k &#8220;<em>MyTodoOrgAPI<\/em>&#8221; &#8216;da <em>Azure AD B2C<\/em> authentication kullan\u0131m\u0131na haz\u0131r durumda.<\/p>\n<p>\u015eimdi ise &#8220;<em>MyTodoOrgWeb<\/em>&#8221; taraf\u0131ndaki kod d\u00fczenlemelerini ger\u00e7ekle\u015ftirelim. \u00d6ncelikle &#8220;<em>MyTodoOrgAPI<\/em>&#8221; template&#8217;i ile haz\u0131r gelen &#8220;<em>WeatherForecast<\/em>&#8221; class&#8217;\u0131n\u0131, &#8220;<em>MyTodoOrgWeb<\/em>&#8221; i\u00e7erisinde de oldu\u011fu gibi tan\u0131mlayal\u0131m. Ard\u0131ndan &#8220;<em>MyTodoOrgWeb<\/em>&#8221; &#8216;in &#8220;<em>Pages<\/em>&#8221; klas\u00f6r\u00fc alt\u0131ndaki &#8220;<em>Index.cshtml<\/em>&#8221; dosyas\u0131n\u0131 a\u015fa\u011f\u0131daki gibi g\u00fcncelleyelim.<\/p>\n<pre>@page\n@model IndexModel\n@using Microsoft.Identity.Web\n@using System.Net.Http.Headers\n\n@inject ITokenAcquisition _tokenAcquisition\n@inject IHttpClientFactory _clientFactory\n\n@{\n    ViewData[\"Title\"] = \"Home page\";\n\n    async Task&lt;List&lt;WeatherForecast&gt;&gt; GetWeatherForecastAsync()\n    {\n        var requiredScopeForMyTodoOrgAPI = \"https:\/\/mytodoorganization.onmicrosoft.com\/mytodoorgapi\/read\";\n        var accessToken = await _tokenAcquisition.GetAccessTokenForUserAsync(scopes: new[] { requiredScopeForMyTodoOrgAPI }, user: User);\n\n\n        string baseAddress = \"http:\/\/localhost:5076\";\n        string route = \"weatherforecasts\";\n\n        var client = _clientFactory.CreateClient();\n        client.BaseAddress = new Uri(baseAddress);\n        client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue(\"Bearer\", accessToken);\n        client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue(\"application\/json\"));\n\n        var response = await client.GetAsync(route);\n\n        if (response.IsSuccessStatusCode)\n        {\n            return await response.Content.ReadFromJsonAsync&lt;List&lt;WeatherForecast&gt;&gt;();\n        }\n\n        throw new Exception(response.ReasonPhrase);\n    }\n}\n\n@if (User.Identity?.IsAuthenticated == true)\n{\n    List&lt;WeatherForecast&gt; weatherForecasts = await GetWeatherForecastAsync();\n\n    &lt;ul&gt;\n        @foreach (var weatherForecast in weatherForecasts)\n        {\n            &lt;li&gt;Date: @weatherForecast.Date.ToShortDateString()&lt;\/li&gt;\n            &lt;li&gt;Summary: @weatherForecast.Summary&lt;\/li&gt;\n            &lt;li&gt;Temperature: @weatherForecast.TemperatureC&lt;\/li&gt;\n        }\n    &lt;\/ul&gt;\n}<\/pre>\n<p>Burada &#8220;<em>GetWeatherForecastAsync<\/em>&#8221; method&#8217;u i\u00e7erisinde &#8220;<em>MyTodoOrgAPI<\/em>&#8221; &#8216;\u0131n\u0131 secure bir \u015fekilde sign-in olmu\u015f kullan\u0131c\u0131 ad\u0131na \u00e7a\u011f\u0131rabilme i\u015flemini ger\u00e7ekle\u015ftirebilmek i\u00e7in, &#8220;<em>Microsoft.Identity.Web<\/em>&#8221; authentication library&#8217;si ile gelen &#8220;<em>ITokenAcquisition<\/em>&#8221; servis&#8217;ini kullan\u0131yoruz. Bu servis bizim i\u00e7in access token alma i\u015flemini otomatik olarak ger\u00e7ekle\u015ftirmektedir.<\/p>\n<p>Bu servis ayr\u0131ca uygulaman\u0131n performans\u0131n\u0131 artt\u0131rabilmek ad\u0131na ilgili access token&#8217;\u0131n cache y\u00f6netimini ve ayr\u0131ca kullan\u0131c\u0131 session&#8217;\u0131n\u0131n ge\u00e7erli kalabilmesi i\u00e7in ilgili access token&#8217;\u0131n yenilenmesi gibi i\u015flemleri de ger\u00e7ekle\u015ftirmektedir.<\/p>\n<blockquote><p><em><strong>NOT<\/strong>: &#8220;baseAddress&#8221; variable&#8217;\u0131n\u0131 kendi local ortam\u0131n\u0131zdaki &#8220;MyTodoOrgAPI<\/em>&#8221; <em>&#8216;\u0131n\u0131n adresi ile de\u011fi\u015ftirmeyi unutmay\u0131n.<\/em><\/p><\/blockquote>\n<p>\u015eimdi &#8220;<em>MyTodoOrgWeb<\/em>&#8221; i\u00e7erisindeki &#8220;<em>Program.cs<\/em>&#8221; dosyas\u0131na gidelim ve &#8220;<em>ITokenAcquisition<\/em>&#8221; servis&#8217;inin etkinle\u015ftirme i\u015flemini &#8220;<em>EnableTokenAcquisitionToCallDownstreamApi<\/em>&#8221; method&#8217;unu &#8220;<em>AddMicrosoftIdentityWebApp<\/em>&#8221; sat\u0131r\u0131ndan sonra dahil ederek ger\u00e7ekle\u015ftirelim. Ayr\u0131ca \u00f6rnek olmas\u0131 a\u00e7\u0131s\u0131ndan in-memory token cache \u00f6zelli\u011fini de aktif edelim. Production ortamlar\u0131 i\u00e7in distributed cache \u00f6zelli\u011fini kullanabiliriz.<\/p>\n<pre>\/\/ Add services to the container.\nbuilder.Services.AddAuthentication(OpenIdConnectDefaults.AuthenticationScheme)\n    .AddMicrosoftIdentityWebApp(builder.Configuration.GetSection(Constants.AzureAdB2C))\n    .EnableTokenAcquisitionToCallDownstreamApi()\n    .AddDistributedTokenCaches();<\/pre>\n<p>&#8220;<em>ITokenAcquisition<\/em>&#8221; servis&#8217;i default olarak <em>authorization code flow<\/em> &#8216;u <em>Web App<\/em> taraf\u0131nda etkin hale getirmektedir. Elbette bu servis&#8217;i kullanmadan da authorization code flow&#8217;u &#8220;<em>MyTodoOrgWeb<\/em>&#8221; taraf\u0131nda etkin hale getirebilirdik. Biz bir \u00f6nceki a\u015famada hen\u00fcz bir <em>API<\/em> &#8216;a sahip olmad\u0131\u011f\u0131m\u0131z i\u00e7in ve sign in i\u015flemlerini kolay bir \u015fekilde ger\u00e7ekle\u015ftirebilmek ad\u0131na implicit grant flow&#8217;u kulland\u0131k. A\u015fa\u011f\u0131daki <em>OpenID Connect<\/em> configuration&#8217;\u0131 ile de <em>Web App<\/em> taraf\u0131nda authorization code flow&#8217;u etkinle\u015ftirebilirdik.<\/p>\n<pre>services.Configure(OpenIdConnectDefaults.AuthenticationScheme, options =&gt;\n{\n   options.ResponseType = \"code\";\n});<\/pre>\n<p>Dolay\u0131s\u0131yla <em>AzureAD B2C<\/em> \u00fczerinden &#8220;<em>MyTodoOrgWeb<\/em>&#8221; uygulamas\u0131 i\u00e7in etkinle\u015ftirmi\u015f oldu\u011fumuz implicit flow&#8217;u, a\u015fa\u011f\u0131daki gibi her iki se\u00e7ene\u011fi de disable ederek, authorization code flow olarak de\u011fi\u015ftirebiliriz.<\/p>\n<p><a href=\"\/wp-content\/uploads\/2023\/11\/auth_code_flow.jpg\"><img decoding=\"async\" class=\"aligncenter size-full wp-image-4426 lazyload\" data-src=\"\/wp-content\/uploads\/2023\/11\/auth_code_flow.jpg\" alt=\"\" width=\"2078\" height=\"854\" data-srcset=\"https:\/\/gokhan-gokalp.com\/wp-content\/uploads\/2023\/11\/auth_code_flow.jpg 2078w, https:\/\/gokhan-gokalp.com\/wp-content\/uploads\/2023\/11\/auth_code_flow-300x123.jpg 300w, https:\/\/gokhan-gokalp.com\/wp-content\/uploads\/2023\/11\/auth_code_flow-1024x421.jpg 1024w, https:\/\/gokhan-gokalp.com\/wp-content\/uploads\/2023\/11\/auth_code_flow-768x316.jpg 768w, https:\/\/gokhan-gokalp.com\/wp-content\/uploads\/2023\/11\/auth_code_flow-1536x631.jpg 1536w, https:\/\/gokhan-gokalp.com\/wp-content\/uploads\/2023\/11\/auth_code_flow-2048x842.jpg 2048w\" data-sizes=\"(max-width: 2078px) 100vw, 2078px\" src=\"data:image\/svg+xml;base64,PHN2ZyB3aWR0aD0iMSIgaGVpZ2h0PSIxIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciPjwvc3ZnPg==\" style=\"--smush-placeholder-width: 2078px; --smush-placeholder-aspect-ratio: 2078\/854;\" \/><\/a><\/p>\n<p>Art\u0131k sign in i\u015flemleri s\u0131ras\u0131nda <em>Web App<\/em> taraf\u0131nda bir authrozaiton code elde ediliyor ve bu kod backend taraf\u0131nda &#8220;<em>ITokenAcquisition<\/em>&#8221; servis&#8217;i vas\u0131tas\u0131yla bir access token elde edebilmek i\u00e7in kullan\u0131l\u0131yor olacak.<\/p>\n<p>\u015eimdi her iki uygulamay\u0131 da \u00e7al\u0131\u015ft\u0131ral\u0131m ve &#8220;<em>MyTodoOrgWeb<\/em>&#8221; &#8216;in tekrardan sign in sayfas\u0131na gelelim. Y\u00f6nlendirildi\u011fimiz user flow&#8217;un <em>URL<\/em> &#8216;inde ise bu sefer &#8220;<em>response_type<\/em>&#8221; &#8216;\u0131n &#8220;code&#8221; olarak set edildi\u011fini g\u00f6rebiliriz.<\/p>\n<p>Sign in i\u015fleminin sonras\u0131nda ise &#8220;<em>MyTodoOrgWeb<\/em>&#8221; &#8216;in authenticate olmu\u015f kullan\u0131c\u0131 ad\u0131na ge\u00e7erli bir access token alarak, &#8220;<em>MyTodoOrgAPI<\/em>&#8221; &#8216;\u0131n\u0131 ba\u015far\u0131l\u0131 bir \u015fekilde consume etti\u011fini de g\u00f6rebiliriz. Ayr\u0131ca &#8220;<em>MyTodoOrgAPI<\/em>&#8221; &#8216;\u0131 taraf\u0131nda ise ilgili bearer token ve scope&#8217;u valide edilerek, ilgili i\u015flem ger\u00e7ekle\u015ftirilmektedir.<\/p>\n<p><a href=\"\/wp-content\/uploads\/2023\/10\/api-result.jpg\"><img decoding=\"async\" class=\"aligncenter size-full wp-image-4417 lazyload\" data-src=\"\/wp-content\/uploads\/2023\/10\/api-result.jpg\" alt=\"\" width=\"1976\" height=\"896\" data-srcset=\"https:\/\/gokhan-gokalp.com\/wp-content\/uploads\/2023\/10\/api-result.jpg 1976w, https:\/\/gokhan-gokalp.com\/wp-content\/uploads\/2023\/10\/api-result-300x136.jpg 300w, https:\/\/gokhan-gokalp.com\/wp-content\/uploads\/2023\/10\/api-result-1024x464.jpg 1024w, https:\/\/gokhan-gokalp.com\/wp-content\/uploads\/2023\/10\/api-result-768x348.jpg 768w, https:\/\/gokhan-gokalp.com\/wp-content\/uploads\/2023\/10\/api-result-1536x696.jpg 1536w\" data-sizes=\"(max-width: 1976px) 100vw, 1976px\" src=\"data:image\/svg+xml;base64,PHN2ZyB3aWR0aD0iMSIgaGVpZ2h0PSIxIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciPjwvc3ZnPg==\" style=\"--smush-placeholder-width: 1976px; --smush-placeholder-aspect-ratio: 1976\/896;\" \/><\/a><\/p>\n<h2>Referanslar<\/h2>\n<blockquote><p><em>https:\/\/learn.microsoft.com\/en-us\/azure\/active-directory-b2c\/enable-authentication-web-api?tabs=csharpclient<br \/>\nhttps:\/\/learn.microsoft.com\/en-us\/azure\/active-directory-b2c\/enable-authentication-web-application?tabs=visual-studio<br \/>\nhttps:\/\/learn.microsoft.com\/en-us\/entra\/identity-platform\/v2-oauth2-auth-code-flow<br \/>\n<\/em><\/p><\/blockquote>\n","protected":false},"excerpt":{"rendered":"<p>Bildi\u011fimiz gibi bir \u00fcr\u00fcn geli\u015ftirirken olabildi\u011fince farkl\u0131 cloud \u00e7\u00f6z\u00fcmlerinden faydalanmak, harcanacak zaman ve karma\u015f\u0131kl\u0131\u011f\u0131n yan\u0131 s\u0131ra, bizlerin farkl\u0131 y\u00f6netimsel masraflardan da olabildi\u011fince ka\u00e7\u0131nabilmesini sa\u011flamaktad\u0131r. G\u00fcn\u00fcm\u00fczde bir \u00e7o\u011fumuz cloud-native uygulamalar geli\u015ftiriyor veya cloud&#8217;a migration&#8217;lar ger\u00e7ekle\u015ftiriyor. Bu s\u00fcre\u00e7lerde ise \u00e7e\u015fitli masraflar\u0131 minimize edebilmek i\u00e7in cloud sa\u011flay\u0131c\u0131lar\u0131n farkl\u0131&#8230;<\/p>\n<div class=\"more-link-wrapper\"><a class=\"more-link\" href=\"https:\/\/gokhan-gokalp.com\/tr\/delegating-identity-and-access-management-to-azure-ad-b2c-and-integrating-with-dotnet\/\">Devam\u0131n\u0131 okuyun<span class=\"screen-reader-text\">Identity &#038; Access Management \u0130\u015flemlerini Azure AD B2C ile .NET Ortam\u0131nda Ger\u00e7ekle\u015ftirmek<\/span><\/a><\/div>\n","protected":false},"author":1,"featured_media":4441,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[5,418,1],"tags":[111,652,678,551,676,679,677],"class_list":["post-4378","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-net","category-azure","category-uncategorized","tag-net","tag-net-7","tag-authorization-code-flow","tag-azure","tag-azure-ad-b2c","tag-identity-access","tag-openid-connect","entry"],"translation":{"provider":"WPGlobus","version":"3.0.2","language":"tr","enabled_languages":["en","tr"],"languages":{"en":{"title":true,"content":true,"excerpt":false},"tr":{"title":true,"content":true,"excerpt":false}}},"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v27.3 - https:\/\/yoast.com\/product\/yoast-seo-wordpress\/ -->\n<title>Identity &amp; Access Management \u0130\u015flemlerini Azure AD B2C ile .NET Ortam\u0131nda Ger\u00e7ekle\u015ftirmek - G\u00f6khan G\u00f6kalp<\/title>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/gokhan-gokalp.com\/delegating-identity-and-access-management-to-azure-ad-b2c-and-integrating-with-dotnet\/\" \/>\n<meta property=\"og:locale\" content=\"tr_TR\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Identity &amp; Access Management \u0130\u015flemlerini Azure AD B2C ile .NET Ortam\u0131nda Ger\u00e7ekle\u015ftirmek - G\u00f6khan G\u00f6kalp\" \/>\n<meta property=\"og:url\" content=\"https:\/\/gokhan-gokalp.com\/delegating-identity-and-access-management-to-azure-ad-b2c-and-integrating-with-dotnet\/\" \/>\n<meta property=\"og:site_name\" content=\"G\u00f6khan G\u00f6kalp\" \/>\n<meta property=\"article:published_time\" content=\"2023-11-19T18:14:55+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2023-11-19T18:36:05+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/gokhan-gokalp.com\/wp-content\/uploads\/2023\/11\/azure-ad-b2c-gokhan-gokalp-com.jpg\" \/>\n\t<meta property=\"og:image:width\" content=\"1200\" \/>\n\t<meta property=\"og:image:height\" content=\"675\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/jpeg\" \/>\n<meta name=\"author\" content=\"G\u00f6khan G\u00f6kalp\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"Yazan:\" \/>\n\t<meta name=\"twitter:data1\" content=\"G\u00f6khan G\u00f6kalp\" \/>\n\t<meta name=\"twitter:label2\" content=\"Tahmini okuma s\u00fcresi\" \/>\n\t<meta name=\"twitter:data2\" content=\"25 dakika\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\\\/\\\/gokhan-gokalp.com\\\/delegating-identity-and-access-management-to-azure-ad-b2c-and-integrating-with-dotnet\\\/#article\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/gokhan-gokalp.com\\\/delegating-identity-and-access-management-to-azure-ad-b2c-and-integrating-with-dotnet\\\/\"},\"author\":{\"name\":\"G\u00f6khan G\u00f6kalp\",\"@id\":\"https:\\\/\\\/gokhan-gokalp.com\\\/#\\\/schema\\\/person\\\/7e2a7fa98babd22a5fdae563c4b8cdbe\"},\"headline\":\"Identity &#038; Access Management \u0130\u015flemlerini Azure AD B2C ile .NET Ortam\u0131nda Ger\u00e7ekle\u015ftirmek\",\"datePublished\":\"2023-11-19T18:14:55+00:00\",\"dateModified\":\"2023-11-19T18:36:05+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\\\/\\\/gokhan-gokalp.com\\\/delegating-identity-and-access-management-to-azure-ad-b2c-and-integrating-with-dotnet\\\/\"},\"wordCount\":4589,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\\\/\\\/gokhan-gokalp.com\\\/#\\\/schema\\\/person\\\/7e2a7fa98babd22a5fdae563c4b8cdbe\"},\"image\":{\"@id\":\"https:\\\/\\\/gokhan-gokalp.com\\\/delegating-identity-and-access-management-to-azure-ad-b2c-and-integrating-with-dotnet\\\/#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/gokhan-gokalp.com\\\/wp-content\\\/uploads\\\/2023\\\/11\\\/azure-ad-b2c-gokhan-gokalp-com.jpg\",\"keywords\":[\".NET\",\".net 7\",\"authorization code flow\",\"azure\",\"azure ad b2c\",\"identity &amp; access\",\"openid connect\"],\"articleSection\":[\".NET\",\"Azure\",\"Uncategorized\"],\"inLanguage\":\"tr\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\\\/\\\/gokhan-gokalp.com\\\/delegating-identity-and-access-management-to-azure-ad-b2c-and-integrating-with-dotnet\\\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/gokhan-gokalp.com\\\/delegating-identity-and-access-management-to-azure-ad-b2c-and-integrating-with-dotnet\\\/\",\"url\":\"https:\\\/\\\/gokhan-gokalp.com\\\/delegating-identity-and-access-management-to-azure-ad-b2c-and-integrating-with-dotnet\\\/\",\"name\":\"Identity & Access Management \u0130\u015flemlerini Azure AD B2C ile .NET Ortam\u0131nda Ger\u00e7ekle\u015ftirmek - G\u00f6khan G\u00f6kalp\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/gokhan-gokalp.com\\\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\\\/\\\/gokhan-gokalp.com\\\/delegating-identity-and-access-management-to-azure-ad-b2c-and-integrating-with-dotnet\\\/#primaryimage\"},\"image\":{\"@id\":\"https:\\\/\\\/gokhan-gokalp.com\\\/delegating-identity-and-access-management-to-azure-ad-b2c-and-integrating-with-dotnet\\\/#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/gokhan-gokalp.com\\\/wp-content\\\/uploads\\\/2023\\\/11\\\/azure-ad-b2c-gokhan-gokalp-com.jpg\",\"datePublished\":\"2023-11-19T18:14:55+00:00\",\"dateModified\":\"2023-11-19T18:36:05+00:00\",\"breadcrumb\":{\"@id\":\"https:\\\/\\\/gokhan-gokalp.com\\\/delegating-identity-and-access-management-to-azure-ad-b2c-and-integrating-with-dotnet\\\/#breadcrumb\"},\"inLanguage\":\"tr\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/gokhan-gokalp.com\\\/delegating-identity-and-access-management-to-azure-ad-b2c-and-integrating-with-dotnet\\\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"tr\",\"@id\":\"https:\\\/\\\/gokhan-gokalp.com\\\/delegating-identity-and-access-management-to-azure-ad-b2c-and-integrating-with-dotnet\\\/#primaryimage\",\"url\":\"https:\\\/\\\/gokhan-gokalp.com\\\/wp-content\\\/uploads\\\/2023\\\/11\\\/azure-ad-b2c-gokhan-gokalp-com.jpg\",\"contentUrl\":\"https:\\\/\\\/gokhan-gokalp.com\\\/wp-content\\\/uploads\\\/2023\\\/11\\\/azure-ad-b2c-gokhan-gokalp-com.jpg\",\"width\":1200,\"height\":675},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/gokhan-gokalp.com\\\/delegating-identity-and-access-management-to-azure-ad-b2c-and-integrating-with-dotnet\\\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\\\/\\\/gokhan-gokalp.com\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Delegating Identity &#038; Access Management to Azure AD B2C and Integrating with .NET\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\\\/\\\/gokhan-gokalp.com\\\/#website\",\"url\":\"https:\\\/\\\/gokhan-gokalp.com\\\/\",\"name\":\"G\u00f6khan G\u00f6kalp\",\"description\":\"C# &amp; Python lover\",\"publisher\":{\"@id\":\"https:\\\/\\\/gokhan-gokalp.com\\\/#\\\/schema\\\/person\\\/7e2a7fa98babd22a5fdae563c4b8cdbe\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\\\/\\\/gokhan-gokalp.com\\\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"tr\"},{\"@type\":[\"Person\",\"Organization\"],\"@id\":\"https:\\\/\\\/gokhan-gokalp.com\\\/#\\\/schema\\\/person\\\/7e2a7fa98babd22a5fdae563c4b8cdbe\",\"name\":\"G\u00f6khan G\u00f6kalp\",\"pronouns\":\"he\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"tr\",\"@id\":\"https:\\\/\\\/gokhan-gokalp.com\\\/wp-content\\\/litespeed\\\/avatar\\\/e645f66b6264ced10d7b6d8b1f85509b.jpg?ver=1776170659\",\"url\":\"https:\\\/\\\/gokhan-gokalp.com\\\/wp-content\\\/litespeed\\\/avatar\\\/e645f66b6264ced10d7b6d8b1f85509b.jpg?ver=1776170659\",\"contentUrl\":\"https:\\\/\\\/gokhan-gokalp.com\\\/wp-content\\\/litespeed\\\/avatar\\\/e645f66b6264ced10d7b6d8b1f85509b.jpg?ver=1776170659\",\"caption\":\"G\u00f6khan G\u00f6kalp\"},\"logo\":{\"@id\":\"https:\\\/\\\/gokhan-gokalp.com\\\/wp-content\\\/litespeed\\\/avatar\\\/e645f66b6264ced10d7b6d8b1f85509b.jpg?ver=1776170659\"},\"sameAs\":[\"https:\\\/\\\/gokhan-gokalp.com\"],\"url\":\"https:\\\/\\\/gokhan-gokalp.com\\\/tr\\\/author\\\/gok-gokalp\\\/\"}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"Identity & Access Management \u0130\u015flemlerini Azure AD B2C ile .NET Ortam\u0131nda Ger\u00e7ekle\u015ftirmek - G\u00f6khan G\u00f6kalp","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/gokhan-gokalp.com\/delegating-identity-and-access-management-to-azure-ad-b2c-and-integrating-with-dotnet\/","og_locale":"tr_TR","og_type":"article","og_title":"Identity & Access Management \u0130\u015flemlerini Azure AD B2C ile .NET Ortam\u0131nda Ger\u00e7ekle\u015ftirmek - G\u00f6khan G\u00f6kalp","og_url":"https:\/\/gokhan-gokalp.com\/delegating-identity-and-access-management-to-azure-ad-b2c-and-integrating-with-dotnet\/","og_site_name":"G\u00f6khan G\u00f6kalp","article_published_time":"2023-11-19T18:14:55+00:00","article_modified_time":"2023-11-19T18:36:05+00:00","og_image":[{"width":1200,"height":675,"url":"https:\/\/gokhan-gokalp.com\/wp-content\/uploads\/2023\/11\/azure-ad-b2c-gokhan-gokalp-com.jpg","type":"image\/jpeg"}],"author":"G\u00f6khan G\u00f6kalp","twitter_card":"summary_large_image","twitter_misc":{"Yazan:":"G\u00f6khan G\u00f6kalp","Tahmini okuma s\u00fcresi":"25 dakika"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/gokhan-gokalp.com\/delegating-identity-and-access-management-to-azure-ad-b2c-and-integrating-with-dotnet\/#article","isPartOf":{"@id":"https:\/\/gokhan-gokalp.com\/delegating-identity-and-access-management-to-azure-ad-b2c-and-integrating-with-dotnet\/"},"author":{"name":"G\u00f6khan G\u00f6kalp","@id":"https:\/\/gokhan-gokalp.com\/#\/schema\/person\/7e2a7fa98babd22a5fdae563c4b8cdbe"},"headline":"Identity &#038; Access Management \u0130\u015flemlerini Azure AD B2C ile .NET Ortam\u0131nda Ger\u00e7ekle\u015ftirmek","datePublished":"2023-11-19T18:14:55+00:00","dateModified":"2023-11-19T18:36:05+00:00","mainEntityOfPage":{"@id":"https:\/\/gokhan-gokalp.com\/delegating-identity-and-access-management-to-azure-ad-b2c-and-integrating-with-dotnet\/"},"wordCount":4589,"commentCount":0,"publisher":{"@id":"https:\/\/gokhan-gokalp.com\/#\/schema\/person\/7e2a7fa98babd22a5fdae563c4b8cdbe"},"image":{"@id":"https:\/\/gokhan-gokalp.com\/delegating-identity-and-access-management-to-azure-ad-b2c-and-integrating-with-dotnet\/#primaryimage"},"thumbnailUrl":"https:\/\/gokhan-gokalp.com\/wp-content\/uploads\/2023\/11\/azure-ad-b2c-gokhan-gokalp-com.jpg","keywords":[".NET",".net 7","authorization code flow","azure","azure ad b2c","identity &amp; access","openid connect"],"articleSection":[".NET","Azure","Uncategorized"],"inLanguage":"tr","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/gokhan-gokalp.com\/delegating-identity-and-access-management-to-azure-ad-b2c-and-integrating-with-dotnet\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/gokhan-gokalp.com\/delegating-identity-and-access-management-to-azure-ad-b2c-and-integrating-with-dotnet\/","url":"https:\/\/gokhan-gokalp.com\/delegating-identity-and-access-management-to-azure-ad-b2c-and-integrating-with-dotnet\/","name":"Identity & Access Management \u0130\u015flemlerini Azure AD B2C ile .NET Ortam\u0131nda Ger\u00e7ekle\u015ftirmek - G\u00f6khan G\u00f6kalp","isPartOf":{"@id":"https:\/\/gokhan-gokalp.com\/#website"},"primaryImageOfPage":{"@id":"https:\/\/gokhan-gokalp.com\/delegating-identity-and-access-management-to-azure-ad-b2c-and-integrating-with-dotnet\/#primaryimage"},"image":{"@id":"https:\/\/gokhan-gokalp.com\/delegating-identity-and-access-management-to-azure-ad-b2c-and-integrating-with-dotnet\/#primaryimage"},"thumbnailUrl":"https:\/\/gokhan-gokalp.com\/wp-content\/uploads\/2023\/11\/azure-ad-b2c-gokhan-gokalp-com.jpg","datePublished":"2023-11-19T18:14:55+00:00","dateModified":"2023-11-19T18:36:05+00:00","breadcrumb":{"@id":"https:\/\/gokhan-gokalp.com\/delegating-identity-and-access-management-to-azure-ad-b2c-and-integrating-with-dotnet\/#breadcrumb"},"inLanguage":"tr","potentialAction":[{"@type":"ReadAction","target":["https:\/\/gokhan-gokalp.com\/delegating-identity-and-access-management-to-azure-ad-b2c-and-integrating-with-dotnet\/"]}]},{"@type":"ImageObject","inLanguage":"tr","@id":"https:\/\/gokhan-gokalp.com\/delegating-identity-and-access-management-to-azure-ad-b2c-and-integrating-with-dotnet\/#primaryimage","url":"https:\/\/gokhan-gokalp.com\/wp-content\/uploads\/2023\/11\/azure-ad-b2c-gokhan-gokalp-com.jpg","contentUrl":"https:\/\/gokhan-gokalp.com\/wp-content\/uploads\/2023\/11\/azure-ad-b2c-gokhan-gokalp-com.jpg","width":1200,"height":675},{"@type":"BreadcrumbList","@id":"https:\/\/gokhan-gokalp.com\/delegating-identity-and-access-management-to-azure-ad-b2c-and-integrating-with-dotnet\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/gokhan-gokalp.com\/"},{"@type":"ListItem","position":2,"name":"Delegating Identity &#038; Access Management to Azure AD B2C and Integrating with .NET"}]},{"@type":"WebSite","@id":"https:\/\/gokhan-gokalp.com\/#website","url":"https:\/\/gokhan-gokalp.com\/","name":"G\u00f6khan G\u00f6kalp","description":"C# &amp; Python lover","publisher":{"@id":"https:\/\/gokhan-gokalp.com\/#\/schema\/person\/7e2a7fa98babd22a5fdae563c4b8cdbe"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/gokhan-gokalp.com\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"tr"},{"@type":["Person","Organization"],"@id":"https:\/\/gokhan-gokalp.com\/#\/schema\/person\/7e2a7fa98babd22a5fdae563c4b8cdbe","name":"G\u00f6khan G\u00f6kalp","pronouns":"he","image":{"@type":"ImageObject","inLanguage":"tr","@id":"https:\/\/gokhan-gokalp.com\/wp-content\/litespeed\/avatar\/e645f66b6264ced10d7b6d8b1f85509b.jpg?ver=1776170659","url":"https:\/\/gokhan-gokalp.com\/wp-content\/litespeed\/avatar\/e645f66b6264ced10d7b6d8b1f85509b.jpg?ver=1776170659","contentUrl":"https:\/\/gokhan-gokalp.com\/wp-content\/litespeed\/avatar\/e645f66b6264ced10d7b6d8b1f85509b.jpg?ver=1776170659","caption":"G\u00f6khan G\u00f6kalp"},"logo":{"@id":"https:\/\/gokhan-gokalp.com\/wp-content\/litespeed\/avatar\/e645f66b6264ced10d7b6d8b1f85509b.jpg?ver=1776170659"},"sameAs":["https:\/\/gokhan-gokalp.com"],"url":"https:\/\/gokhan-gokalp.com\/tr\/author\/gok-gokalp\/"}]}},"_links":{"self":[{"href":"https:\/\/gokhan-gokalp.com\/tr\/wp-json\/wp\/v2\/posts\/4378","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/gokhan-gokalp.com\/tr\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/gokhan-gokalp.com\/tr\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/gokhan-gokalp.com\/tr\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/gokhan-gokalp.com\/tr\/wp-json\/wp\/v2\/comments?post=4378"}],"version-history":[{"count":44,"href":"https:\/\/gokhan-gokalp.com\/tr\/wp-json\/wp\/v2\/posts\/4378\/revisions"}],"predecessor-version":[{"id":4443,"href":"https:\/\/gokhan-gokalp.com\/tr\/wp-json\/wp\/v2\/posts\/4378\/revisions\/4443"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/gokhan-gokalp.com\/tr\/wp-json\/wp\/v2\/media\/4441"}],"wp:attachment":[{"href":"https:\/\/gokhan-gokalp.com\/tr\/wp-json\/wp\/v2\/media?parent=4378"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/gokhan-gokalp.com\/tr\/wp-json\/wp\/v2\/categories?post=4378"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/gokhan-gokalp.com\/tr\/wp-json\/wp\/v2\/tags?post=4378"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}