﻿
{"id":12580,"date":"2019-11-30T23:03:25","date_gmt":"2019-11-30T23:03:25","guid":{"rendered":"https:\/\/www.gencayyildiz.com\/blog\/?p=12580"},"modified":"2019-12-01T09:02:55","modified_gmt":"2019-12-01T09:02:55","slug":"asp-net-core-identity-claim-bazli-kimlik-dogrulama-xvii","status":"publish","type":"post","link":"https:\/\/www.gencayyildiz.com\/blog\/asp-net-core-identity-claim-bazli-kimlik-dogrulama-xvii\/","title":{"rendered":"Asp.NET Core Identity \u2013 Claim Bazl\u0131 Kimlik Do\u011frulama \u2013 XVII"},"content":{"rendered":"<div id=\"fb-root\"><\/div>\n<p>Merhaba,<\/p>\n<p>Bu i\u00e7eri\u011fimizde <a href=\"https:\/\/www.gencayyildiz.com\/blog\/asp-net-core-identity-yazi-dizisi\/\" target=\"_blank\" rel=\"noopener noreferrer\">Asp.NET Core Identity yaz\u0131 dizimizin<\/a> 17. makalesi olan Claim Bazl\u0131 Kimlik Do\u011frulama(Claims Based Authorization) y\u00f6ntemini inceleyece\u011fiz.<\/p>\n<p>Her\u015feyden \u00f6nce kavramsal temelleri oturtabilmek i\u00e7in ilk olarak temel tan\u0131mlamalarda bulunmam\u0131z gerekmektedir. O halde buyrun Claim&#8217;\u0131n ne oldu\u011fundan ba\u015flayal\u0131m.<\/p>\n<h3>Claim Nedir?<\/h3>\n<p>Claim kelimesinin bir\u00e7ok s\u00f6zl\u00fck anlam\u0131 mevcuttur. Bunlar; <u>fiili<\/u> olarak &#8220;<em>talep etmek(f)<\/em>&#8220;, &#8220;<em>iddia etmek(f)<\/em>&#8221; olmakla birlikte <u>isim<\/u> olarak ise &#8220;<em>sav(i)<\/em>&#8220;, &#8220;<em>istek(i)<\/em>&#8221; yahut &#8220;<em>iddia(i)<\/em>&#8221; kar\u015f\u0131l\u0131\u011f\u0131na gelmektedir. Yaz\u0131l\u0131msal a\u00e7\u0131dan olay\u0131 de\u011ferlendirdi\u011fimizde ise kullan\u0131c\u0131 hakk\u0131nda key &#8211; value \u015feklinde hususi bilgiler tutan ve bunlar\u0131 bizlere <u>yapt\u0131\u011f\u0131m\u0131z talepler neticesinde getiren<\/u> bir yap\u0131 s\u00f6z konusudur.<\/p>\n<h3>Claim Ne Ama\u00e7la Kullan\u0131lmaktad\u0131r?<\/h3>\n<p>Yukar\u0131da bahsedildi\u011fi gibi kullan\u0131c\u0131 hakk\u0131nda hususi bilgiler tutabilmek i\u00e7in kullan\u0131lmaktad\u0131r. Tabi temel ama\u00e7 bu de\u011fildir. As\u0131l ama\u00e7, bu bilgileri yetkilendirme senaryolar\u0131ndan <a href=\"https:\/\/www.gencayyildiz.com\/blog\/asp-net-core-identity-sayfalari-yetkilendirme-authorization-xv\/\" target=\"_blank\" rel=\"noopener noreferrer\">rol bazl\u0131 yetkilendirme<\/a>nin s\u0131n\u0131rlar\u0131n\u0131 daha da esnetebilmek ve uygulamada i\u015flev g\u00f6recek olan kullan\u0131c\u0131n\u0131n edindi\u011fi rol\u00fcn d\u0131\u015f\u0131nda \u00f6zelle\u015ftirilmi\u015f kontroller sa\u011flayabilmek i\u00e7in tercih edilmektedir. S\u00f6z gelimi bu tarz bir kullan\u0131mada Claim Bazl\u0131 Yetkilendirme denmektedir.<\/p>\n<h3>Neden Claim Bazl\u0131 Yetkilendirme Kullanmal\u0131y\u0131z?<\/h3>\n<p>Bu sorunun cevab\u0131n\u0131 \u015f\u00f6yle \u00f6rneklendirebiliriz; internet \u00fczerinden video hizmeti veren bir web uygulamas\u0131n\u0131 misal olarak ele alal\u0131m. Sistem taraf\u0131ndan &#8220;\u0130zleyici&#8221; rol\u00fc atanm\u0131\u015f kullan\u0131c\u0131lara video hizmeti verildi\u011fini d\u00fc\u015f\u00fcnelim. Ayriyetten uygulamada &#8220;komedi&#8221;, &#8220;gerilim&#8221; ve &#8220;korku&#8221; kategorilerinin mevcut oldu\u011funu ve her bir kategorinin belirli bir ya\u015f aral\u0131\u011f\u0131 taraf\u0131ndan eri\u015filebilir oldu\u011funu d\u00fc\u015f\u00fcnelim. Evet, burada her ne kadar rol bazl\u0131 yetkilendirme olmu\u015f olsada neticede bu ya\u015f aral\u0131\u011f\u0131n\u0131n rol bazl\u0131 yetkilendirmeyle \u00f6l\u00e7\u00fclebilmesi pek m\u00fcmk\u00fcn de\u011fildir. Nihayetinde her bir kategoriye eri\u015fim i\u00e7in \u00f6ncelikli \u015fart &#8220;\u0130zleyici&#8221; rol\u00fcnde olunmas\u0131d\u0131r lakin her bir kategori ba\u015fl\u0131 ba\u015f\u0131na sisteme giri\u015f yapm\u0131\u015f ve &#8220;\u0130zleyici&#8221; rol\u00fcn\u00fc alm\u0131\u015f o kullan\u0131c\u0131n\u0131n ya\u015f aral\u0131\u011f\u0131n\u0131 kontrol etmeli ve uygunsa eri\u015fim sa\u011flamal\u0131d\u0131r. \u0130\u015fte burada ya\u015f aral\u0131\u011f\u0131n\u0131 \u00f6l\u00e7ebilmek i\u00e7in ilgili kullan\u0131c\u0131lara ya\u015f de\u011ferlerinin claim olarak atanmas\u0131 sa\u011flanmal\u0131 ve claim bazl\u0131 bir yetkilendirme yap\u0131lmal\u0131d\u0131r.<\/p>\n<p>Ya da bir ba\u015fka \u00f6rnek vermemiz gerekirse; bir makale sitesinde makaleleri kullan\u0131c\u0131lara \u00f6deme yap\u0131p yapmama bilgilerine g\u00f6re g\u00f6sterip g\u00f6stermeme durumu yine claim bazl\u0131 bir yetkilendirmenin sayesinde ger\u00e7ekle\u015fecektir. Nihayetinde burada her bir kullan\u0131c\u0131ya atanan &#8220;Kullan\u0131c\u0131&#8221; rol\u00fc ile kullan\u0131c\u0131lar tan\u0131mlan\u0131rken, \u00f6deme bilgisi ise claim ile eklenmekte ve claim tabanl\u0131 yetkilendirme ile kontrol edilmektedir.<\/p>\n<p>Yani uzun laf\u0131n k\u0131sas\u0131;<\/p>\n<blockquote><p><em style=\"color: orange;\"><strong>Claimler; rollerin d\u0131\u015f\u0131nda kullan\u0131c\u0131 hakk\u0131nda bilgi tutmam\u0131z\u0131 ve bu bilgilere g\u00f6re yetkilendirme yapmam\u0131z\u0131 sa\u011flayan yap\u0131lard\u0131r.<\/strong><\/em><\/p><\/blockquote>\n<h3>Claim Mekanizmas\u0131 Nas\u0131l \u00c7al\u0131\u015fmaktad\u0131r?<\/h3>\n<p>Kullan\u0131c\u0131ya dair tan\u0131mlanm\u0131\u015f ekstra bilgiler olan claimleri kullanarak yetkilendirme i\u015flevini ger\u00e7ekle\u015ftirebilmek i\u00e7in cookie de\u011feri kullan\u0131lmaktad\u0131r. Sisteme giri\u015f yapacak olan kullan\u0131c\u0131ya \u00f6zel tan\u0131mlanm\u0131\u015f claimler olu\u015fturulan Cookie de\u011ferinin i\u00e7erisine eklenmekte ve laz\u0131m oldu\u011fu taktirde oradan eri\u015filmektedir. Burada <em><strong>Peki cookie i\u00e7erisine claim bilgileri nas\u0131l eklenmektedir?<\/strong><\/em> sorunuzu duyar gibiyim&#8230; Bu soruya esas cevab\u0131 ilerleyen sat\u0131rlarda pratik olarak verece\u011fimizden dolay\u0131 \u015fimdilik <u>&#8216;iki farkl\u0131 y\u00f6ntemle ekleme yapabiliriz&#8217;<\/u> \u015feklinde k\u0131sa bir kar\u015f\u0131l\u0131kla neticelendirelim. Yine de bir iki kelamla teorik olarak bahsetmemiz gerekirse bu iki y\u00f6ntemden ilki kullan\u0131c\u0131ya dair cookie de\u011feri olu\u015fturulurken o anda (dinamik olarak)eklemeyken bir di\u011feri ise veritaban\u0131nda kullan\u0131c\u0131yla ili\u015fkisel tutulan claim verilerinin derlenip eklenmesidir.<\/p>\n<p>Velhas\u0131l \u015fimdi biz claim yap\u0131lanmas\u0131n\u0131n mekanizmas\u0131n\u0131 somutla\u015ft\u0131rmaya devam edelim. Kullan\u0131c\u0131ya dair claimlere eri\u015febilmek i\u00e7in a\u015fa\u011f\u0131daki g\u00f6rselde \u015fematize edildi\u011fi gibi &#8220;<em>System.Security.Claims<\/em>&#8221; napespace&#8217;i alt\u0131nda bulunan <em>ClaimsPrincipal<\/em> t\u00fcr\u00fcnden olan &#8220;<em>User<\/em>&#8221; propertysinin &#8220;<em>User.Claims<\/em>&#8221; komutunu kullanabiliriz.<\/p>\n<p><a href=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2019\/11\/Asp.NET-Core-Identity-\u2013-Claim-Bazl\u0131-Kimlik-Do\u011frulama-\u2013-XVII.png\"><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter size-full wp-image-12616\" src=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2019\/11\/Asp.NET-Core-Identity-\u2013-Claim-Bazl\u0131-Kimlik-Do\u011frulama-\u2013-XVII.png\" alt=\"Asp.NET Core Identity \u2013 Claim Bazl\u0131 Kimlik Do\u011frulama \u2013 XVII\" width=\"866\" height=\"162\" srcset=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2019\/11\/Asp.NET-Core-Identity-\u2013-Claim-Bazl\u0131-Kimlik-Do\u011frulama-\u2013-XVII.png 866w, https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2019\/11\/Asp.NET-Core-Identity-\u2013-Claim-Bazl\u0131-Kimlik-Do\u011frulama-\u2013-XVII-300x56.png 300w, https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2019\/11\/Asp.NET-Core-Identity-\u2013-Claim-Bazl\u0131-Kimlik-Do\u011frulama-\u2013-XVII-768x144.png 768w\" sizes=\"auto, (max-width: 866px) 100vw, 866px\" \/><\/a><\/p>\n<p>Ayr\u0131ca yine ayn\u0131 namespace alt\u0131nda bulunan &#8220;<em>ClaimsIdentity<\/em>&#8221; t\u00fcr\u00fcnden olan nesne \u00fczerinden ilgili kullan\u0131c\u0131n\u0131n t\u00fcm verilerini elde edebilir ve claimlerine eri\u015febiliriz.<br \/>\n<a href=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2019\/11\/Asp.NET-Core-Identity-\u2013-Claim-Bazl\u0131-Kimlik-Do\u011frulama-\u2013-XVII-1.png\"><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter size-full wp-image-12622\" src=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2019\/11\/Asp.NET-Core-Identity-\u2013-Claim-Bazl\u0131-Kimlik-Do\u011frulama-\u2013-XVII-1.png\" alt=\"Asp.NET Core Identity \u2013 Claim Bazl\u0131 Kimlik Do\u011frulama \u2013 XVII\" width=\"559\" height=\"234\" srcset=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2019\/11\/Asp.NET-Core-Identity-\u2013-Claim-Bazl\u0131-Kimlik-Do\u011frulama-\u2013-XVII-1.png 559w, https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2019\/11\/Asp.NET-Core-Identity-\u2013-Claim-Bazl\u0131-Kimlik-Do\u011frulama-\u2013-XVII-1-300x126.png 300w\" sizes=\"auto, (max-width: 559px) 100vw, 559px\" \/><\/a><\/p>\n<h3>Claim Ekleme Y\u00f6ntemleri<\/h3>\n<p>Uygulamaya ba\u015far\u0131l\u0131 bir \u015fekilde giri\u015f ger\u00e7ekle\u015ftiren kullan\u0131c\u0131ya &#8220;Dinamik Ekleme&#8221; ve &#8220;Veritaban\u0131ndan Ekleme&#8221; olmak \u00fczere o anki ihtiyaca istinaden teknik a\u00e7\u0131dan farkl\u0131 iki y\u00f6ntemle claim dahil edebilmekteyiz. Tabi ki de bu dahil edilen claimler s\u00fcre\u00e7te kullan\u0131c\u0131 i\u00e7in cookie bilgilerinde tutulacak ve gerekti\u011fi taktirde oradan eri\u015filecektir. \u015eimdi gelin bu iki y\u00f6ntemi inceleyelim;<\/p>\n<ul>\n<li><strong>Dinamik Ekleme<\/strong><br \/>\nKullan\u0131c\u0131ya dair eklenecek claimin veritaban\u0131ndaki <a href=\"https:\/\/www.gencayyildiz.com\/blog\/asp-net-core-identity-veritabani-tablolarini-inceleyelim-iii\/\" target=\"_blank\" rel=\"noopener noreferrer\">AspNetUserClaims<\/a> tablosunda herhangi bir kar\u015f\u0131l\u0131\u011f\u0131 yahut fiziksel bir kayd\u0131n\u0131n olmamas\u0131 durumunda direkt olarak cookie de\u011ferine dahil edilmesi ile kullan\u0131lan y\u00f6ntemdir. Genellikle veritaban\u0131nda tutulmas\u0131na l\u00fczum olmayan yahut AspNetUserClaims tablosunun d\u0131\u015f\u0131ndaki tablolarda zaten mevcut olan verilerin claim olarak eklenmesi i\u00e7in kullan\u0131l\u0131r. \u00d6rne\u011fin, &#8216;do\u011fum tarihi&#8217; bilgisi genellikle kullan\u0131c\u0131(user) nesnesinde tutuldu\u011fundan dolay\u0131 bu bilgiyi ekstradan AspNetUserClaims tablosunda tutman\u0131n bir manas\u0131 bulunmamaktad\u0131r. Dolay\u0131s\u0131yla bu bilgiyi do\u011frudan elde edip claim olarak dinamik bir \u015fekilde eklememiz daha do\u011fru olacakt\u0131r.<em>Peki nas\u0131l uygulayaca\u011f\u0131z?<\/em><br \/>\nDinamik bir \u015fekilde claim ekleyebilmek i\u00e7in \u00f6ncelikle &#8220;IClaimsTransformation&#8221; interfaceinden t\u00fcreyen bir provider olu\u015fturmam\u0131z gerekmektedir.<\/p>\n<pre class=\"brush: jscript; title: ; notranslate\" title=\"\">\r\n    public class UserClaimProvider : IClaimsTransformation\r\n    {\r\n        public async Task&lt;ClaimsPrincipal&gt; TransformAsync(ClaimsPrincipal principal)\r\n        {\r\n            ClaimsIdentity identity = principal.Identity as ClaimsIdentity;\r\n            Claim claim = null;\r\n            if (principal.HasClaim(x =&gt; x.Type == &quot;username&quot;))\r\n            {\r\n                claim = new Claim(&quot;username&quot;, identity.Name);\r\n                identity.AddClaim(claim);\r\n            }\r\n            if (principal.HasClaim(x =&gt; x.Type == &quot;logintime&quot;))\r\n            {\r\n                claim = new Claim(&quot;logintime&quot;, DateTime.Now.ToString());\r\n                identity.AddClaim(claim);\r\n            }\r\n\r\n            return principal;\r\n        }\r\n    }\r\n<\/pre>\n<p>Yukar\u0131daki kod blo\u011funA g\u00f6z atarsan\u0131z e\u011fer &#8220;UserClaimProvider&#8221; ismini verdi\u011fimiz provider s\u0131n\u0131f\u0131m\u0131zda &#8220;IClaimsTransformation&#8221; interfaceinin implementi neticesinde uygulanan &#8220;TransformAsync&#8221; metodu i\u00e7erisinde kullan\u0131c\u0131ya claimler tan\u0131mlanmakta ve eklenmektedir. Yap\u0131land\u0131r\u0131lan bu sa\u011flayac\u0131n\u0131n uygulamada \u00e7al\u0131\u015fabilmesi ve her bir kullan\u0131c\u0131 \u00fczerinde bu claim de\u011ferlerini ekleyebilmesi i\u00e7in uygulamaya dahil edilmesi gerekmektedir.<\/p>\n<p>Bunun i\u00e7in uygulaman\u0131n Startup.cs dosyas\u0131 i\u00e7erisindeki &#8220;ConfigureServices&#8221; metodunda a\u015fa\u011f\u0131daki konfig\u00fcrasyonun yap\u0131lmas\u0131 gerekmektedir.<\/p>\n<pre class=\"brush: jscript; title: ; notranslate\" title=\"\">\r\n    public class Startup\r\n    {\r\n        public void ConfigureServices(IServiceCollection services)\r\n        {\r\n            .\r\n            .\r\n            .\r\n            services.AddScoped&lt;IClaimsTransformation, UserClaimProvider&gt;();\r\n            .\r\n            .\r\n            .\r\n        }\r\n        .\r\n        .\r\n        .\r\n    }\r\n<\/pre>\n<p>Olu\u015fturdu\u011fumuz provider nesnesini &#8220;AddScoped&#8221; ile uygulamaya dahil ederek Dependency Injection ile kullan\u0131labilir hale getirmi\u015f olduk.<\/p>\n<p>\u015eimdi bu noktaya kadar in\u015fa edilen claim yap\u0131lanmas\u0131n\u0131 kullanarak claim bazl\u0131 yetkilendirmeyi ele almadan \u00f6nce veritaban\u0131ndan ekleme y\u00f6nteminide inceleyelim.<\/li>\n<li><strong>Veritaban\u0131ndan Ekleme<\/strong><br \/>\nDinamik olarak eklemeye nazaran veritaban\u0131ndaki AspNetUserClaims tablosuna kullan\u0131c\u0131yla ili\u015fkisel bir \u015fekilde fiziksel claim ekleyerek icra edilen y\u00f6ntemdir. Kullan\u0131c\u0131ya ait claimler her seferinde tekrar \u00fcretilmek yerine veritaban\u0131na bir kereye mahsus eklenir ve her talepte mevcut olan elde edilip i\u015flev ger\u00e7ekle\u015ftirilir.<em>Uygulama<\/em><br \/>\nUygulamay\u0131 ger\u00e7ekle\u015ftirebilmek i\u00e7in yap\u0131lmas\u0131 gereken ilgili actionda claim yap\u0131lanmas\u0131n\u0131 in\u015fa etmektir. \u00d6rne\u011fin, bizim a\u015fa\u011f\u0131daki gibi kullan\u0131c\u0131n\u0131n login i\u015flemini yapt\u0131\u011f\u0131 actionda ger\u00e7ekle\u015ftirdi\u011fimiz gibi&#8230;<\/p>\n<pre class=\"brush: jscript; title: ; notranslate\" title=\"\">\r\n        &#x5B;HttpPost]\r\n        public async Task&lt;IActionResult&gt; Login(UserLoginVM model)\r\n        {\r\n            AppUser user = await _userManager.FindByEmailAsync(model.Email);\r\n            var userClaims = await _userManager.GetClaimsAsync(user);\r\n            if (user != null)\r\n            {\r\n                Microsoft.AspNetCore.Identity.SignInResult result = await _signInManager.PasswordSignInAsync(user, model.Password, true, true);\r\n                if (result.Succeeded)\r\n                {\r\n                    Claim claim = new Claim(&quot;pozisyon&quot;, &quot;admin&quot;);\r\n                    if (!userClaims.Any(x =&gt; x.Type == &quot;pozisyon&quot;))\r\n                        await _userManager.AddClaimAsync(user, claim);\r\n                    return RedirectToAction(&quot;Index&quot;, &quot;Home&quot;);\r\n                }\r\n            }\r\n            return View(model);\r\n        }\r\n<\/pre>\n<p>Yukar\u0131daki kod blo\u011funu incelerseniz e\u011fer kullan\u0131c\u0131 giri\u015f yapt\u0131ktan sonra ilgili kullan\u0131c\u0131ya \u00f6zel bir claim tan\u0131mlanmakta ve veritaban\u0131na eklenmektedir. Herhangi bir kullan\u0131c\u0131n\u0131n yapm\u0131\u015f oldu\u011fu bir login i\u015fleminde veritaban\u0131na claim kayd\u0131n\u0131n olu\u015fturuldu\u011funu a\u015fa\u011f\u0131daki g\u00f6rselden daha rahat inceleyebilirsiniz;<br \/>\n<a href=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2019\/11\/Asp.NET-Core-Identity-\u2013-Claim-Bazl\u0131-Kimlik-Do\u011frulama-\u2013-XVII-2.png\"><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter size-full wp-image-12657\" src=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2019\/11\/Asp.NET-Core-Identity-\u2013-Claim-Bazl\u0131-Kimlik-Do\u011frulama-\u2013-XVII-2.png\" alt=\"Asp.NET Core Identity \u2013 Claim Bazl\u0131 Kimlik Do\u011frulama \u2013 XVII\" width=\"444\" height=\"66\" srcset=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2019\/11\/Asp.NET-Core-Identity-\u2013-Claim-Bazl\u0131-Kimlik-Do\u011frulama-\u2013-XVII-2.png 444w, https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2019\/11\/Asp.NET-Core-Identity-\u2013-Claim-Bazl\u0131-Kimlik-Do\u011frulama-\u2013-XVII-2-300x45.png 300w\" sizes=\"auto, (max-width: 444px) 100vw, 444px\" \/><\/a><\/li>\n<\/ul>\n<p>Bu i\u015flemlerden sonra s\u0131ra olu\u015fturulan ve uygulamaya dahil edilen bu claim yap\u0131lanmas\u0131 ile yetkilendirme i\u015flemini ele almaya geldi.<\/p>\n<h2>Claim Bazl\u0131 Yetkilendirme<\/h2>\n<p>Olu\u015fturulan claimleri kullanarak yetkilendirme yapabilmek i\u00e7in Startup.cs dosyas\u0131ndaki &#8220;ConfigureServices&#8221; metodu i\u00e7erisinde a\u015fa\u011f\u0131daki gibi <a href=\"https:\/\/www.gencayyildiz.com\/blog\/asp-net-core-identity-politika-bazli-kimlik-dogrulama-xvi\/\" target=\"_blank\" rel=\"noopener noreferrer\">politika<\/a> olu\u015fturmal\u0131 ve claimlerdeki de\u011ferleri belirledi\u011fimiz static de\u011ferlerle zorunlu k\u0131lmal\u0131y\u0131z;<\/p>\n<pre class=\"brush: jscript; title: ; notranslate\" title=\"\">\r\n    public class Startup\r\n    {\r\n        public void ConfigureServices(IServiceCollection services)\r\n        {\r\n            .\r\n            .\r\n            .\r\n            services.AddScoped&lt;IClaimsTransformation, UserClaimProvider&gt;();\r\n            services.AddAuthorization(x =&gt; x.AddPolicy(&quot;UserClaimNamePolicy&quot;, policy =&gt; policy.RequireClaim(&quot;username&quot;, &quot;gncy&quot;)));\r\n            services.AddAuthorization(x =&gt; x.AddPolicy(&quot;UserClaimPositionPolicy&quot;, policy =&gt; policy.RequireClaim(&quot;pozisyon&quot;, &quot;admin&quot;)));\r\n            .\r\n            .\r\n            .\r\n        }\r\n    }\r\n<\/pre>\n<p>Yukar\u0131daki kod blo\u011funu incelerseniz e\u011fer &#8220;UserClaimNamePolicy&#8221; ve &#8220;UserClaimPositionPolicy&#8221; olmak \u00fczere iki adet politika olu\u015fturulmu\u015ftur ve i\u015flevsel olarak s\u0131ras\u0131yla; ilki sistemdeki kullan\u0131c\u0131n\u0131n claimType de\u011feri &#8220;username&#8221; olan claiminin &#8220;gncy&#8221; de\u011ferinde olmas\u0131n\u0131 ve ikincisinin ise yine sistemdeki kullan\u0131c\u0131n\u0131n &#8220;pozisyon&#8221; claimType de\u011ferindeki claiminin &#8220;admin&#8221; olmas\u0131n\u0131 \u015fart ko\u015fmaktad\u0131r.<\/p>\n<p>Bu politikalar\u0131 kullanabilmek i\u00e7in <a href=\"https:\/\/www.gencayyildiz.com\/blog\/asp-net-core-identity-politika-bazli-kimlik-dogrulama-xvi\/\" target=\"_blank\" rel=\"noopener noreferrer\">Politika Bazl\u0131 Kimlik Do\u011frulama<\/a> makalesinde ele al\u0131nd\u0131\u011f\u0131 gibi yetkilendirilecek action ya da controllerlar\u0131 ilgili politikalarla i\u015faretlememiz yeterlidir.<\/p>\n<pre class=\"brush: jscript; title: ; notranslate\" title=\"\">\r\n    public class HomeController : Controller\r\n    {\r\n        public IActionResult Index()\r\n        {\r\n            return View();\r\n        }\r\n        &#x5B;Authorize(Policy = &quot;UserClaimNamePolicy&quot;)]\r\n        public IActionResult Page1()\r\n        {\r\n            return View();\r\n        }\r\n        &#x5B;Authorize(Policy = &quot;UserClaimPositionPolicy&quot;)]\r\n        public IActionResult Page2()\r\n        {\r\n            return View();\r\n        }\r\n    }\r\n<\/pre>\n<p>Yukar\u0131daki kod blo\u011funda g\u00f6r\u00fcld\u00fc\u011f\u00fc \u00fczere &#8220;Page1&#8221; ve &#8220;Page2&#8221; sayfalar\u0131 olu\u015fturulan politikalarla i\u015faretlenmi\u015ftir ve b\u00f6ylece claim bazl\u0131 yetkilendirme ger\u00e7ekle\u015ftirilmi\u015ftir. A\u015fa\u011f\u0131daki ekran g\u00f6r\u00fcnt\u00fcs\u00fcnde de oldu\u011fu gibi sistemdeki kullan\u0131c\u0131 rollerin d\u0131\u015f\u0131nda belirtilen politikalar e\u015fli\u011finde zorunlu k\u0131l\u0131nan claim de\u011ferleri ile ba\u015far\u0131l\u0131 bir \u015fekilde yetkilendirilmekte ve daha geni\u015f ve detayl\u0131 bir y\u00f6netim sergilenmektedir.<br \/>\n<a href=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2019\/11\/Asp.NET-Core-Identity-\u2013-Claim-Bazl\u0131-Kimlik-Do\u011frulama-\u2013-XVII.gif\"><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter size-full wp-image-12667\" src=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2019\/11\/Asp.NET-Core-Identity-\u2013-Claim-Bazl\u0131-Kimlik-Do\u011frulama-\u2013-XVII.gif\" alt=\"Asp.NET Core Identity \u2013 Claim Bazl\u0131 Kimlik Do\u011frulama \u2013 XVII\" width=\"800\" height=\"184\" \/><\/a><\/p>\n<p>Nihai olarak kullan\u0131c\u0131 yetkilendirme senaryolar\u0131nda rol bazl\u0131 yetkilendirmenin d\u0131\u015f\u0131nda claim bazl\u0131 yetkilendirmeyi incelemi\u015f ve daha teraffuatl\u0131 bir yap\u0131lanman\u0131n nas\u0131l in\u015fa edilebilece\u011fini detaylar\u0131yla irdelemi\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<p>Not : \u00d6rnek projeyi indirmek i\u00e7in <a href=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2019\/11\/ClaimBaseAuthorization.zip\">buraya t\u0131klay\u0131n\u0131z<\/a>.<\/p>\n<!-- AddThis Advanced Settings generic via filter on the_content --><!-- AddThis Share Buttons generic via filter on the_content -->","protected":false},"excerpt":{"rendered":"<p>Merhaba, Bu i\u00e7eri\u011fimizde Asp.NET Core Identity yaz\u0131 dizimizin 17. makalesi olan Claim Bazl\u0131 Kimlik Do\u011frulama(Claims Based Authorization) y\u00f6ntemini inceleyece\u011fiz. Her\u015feyden \u00f6nce kavramsal temelleri oturtabilmek i\u00e7in ilk olarak temel tan\u0131mlamalarda bulunmam\u0131z gerekmektedir. O halde buyrun&#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":11583,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[3033,2668,2656,2811,2832,2898],"tags":[2952,3064,3065,3068,3066,3069,3067],"class_list":["post-12580","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-net-core-3-0","category-asp-net-core-2","category-asp-net-core-2-mvc","category-asp-net-core-2-1","category-asp-net-core-2-2","category-asp-net-core-3-0","tag-asp-net-core-identity","tag-claim-bazli-kimlik-dogrulama","tag-claims-based-authorization","tag-claimsidentity","tag-claimsprincipal","tag-iclaimstransformation","tag-system-security-claims"],"amp_enabled":true,"_links":{"self":[{"href":"https:\/\/www.gencayyildiz.com\/blog\/wp-json\/wp\/v2\/posts\/12580","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=12580"}],"version-history":[{"count":85,"href":"https:\/\/www.gencayyildiz.com\/blog\/wp-json\/wp\/v2\/posts\/12580\/revisions"}],"predecessor-version":[{"id":12674,"href":"https:\/\/www.gencayyildiz.com\/blog\/wp-json\/wp\/v2\/posts\/12580\/revisions\/12674"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.gencayyildiz.com\/blog\/wp-json\/wp\/v2\/media\/11583"}],"wp:attachment":[{"href":"https:\/\/www.gencayyildiz.com\/blog\/wp-json\/wp\/v2\/media?parent=12580"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.gencayyildiz.com\/blog\/wp-json\/wp\/v2\/categories?post=12580"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.gencayyildiz.com\/blog\/wp-json\/wp\/v2\/tags?post=12580"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}