﻿
{"id":19408,"date":"2020-11-24T23:36:50","date_gmt":"2020-11-24T23:36:50","guid":{"rendered":"https:\/\/www.gencayyildiz.com\/blog\/?p=19408"},"modified":"2020-11-24T23:38:47","modified_gmt":"2020-11-24T23:38:47","slug":"identityserver4-yazi-serisi-19-iprofileservice-arayuzu-ile-dinamik-claim-ekleme","status":"publish","type":"post","link":"https:\/\/www.gencayyildiz.com\/blog\/identityserver4-yazi-serisi-19-iprofileservice-arayuzu-ile-dinamik-claim-ekleme\/","title":{"rendered":"IdentityServer4 Yaz\u0131 Serisi #19 \u2013 IProfileService Aray\u00fcz\u00fc \u0130le Dinamik Claim Ekleme"},"content":{"rendered":"<div id=\"fb-root\"><\/div>\n<p>Merhaba,<\/p>\n<p>Makale serimizin bu ondokuzuncu i\u00e7eri\u011fine kadar bir hususun anla\u015f\u0131ld\u0131\u011f\u0131 kanaatindeyim ki, o da, kullan\u0131c\u0131lar hakk\u0131nda kimlik bilgilerinin ciddi \u00f6nem arz etmesidir. Kullan\u0131c\u0131larda claim olarak tutulmakta olan bu bilgileri bizler \u015fu ana kadar \u00f6n tan\u0131ml\u0131 bir vaziyette &#8216;Config.cs&#8217; dosyas\u0131ndan eklemekte ve y\u00f6netmekteydik. Halbuki kullan\u0131c\u0131lara dair claim&#8217;lerin bu \u015fekilde \u00f6n tan\u0131ml\u0131 olarak eklenmesi pekte tercih edilebilir bir y\u00f6ntem de\u011fildir. Nihayetinde claim de\u011ferlerinin kodun i\u00e7erisinde g\u00f6m\u00fcl\u00fc bir vaziyette olmas\u0131 bir metinsel ba\u011f\u0131ml\u0131l\u0131k yaratmaktad\u0131r. Ayr\u0131ca bu kullan\u0131c\u0131 bilgilerini veritaban\u0131ndan yahut benzer bir kaynaktan edinmek istedi\u011fimizde i\u015fi runtime&#8217;da \u00e7\u00f6zmemiz gerekecektir. IdentityServer4, kullan\u0131c\u0131ya dair eklenecek olan claim bilgilerini runtime&#8217;da dinamik bir \u015fekilde y\u00fckleyebilmemizi sa\u011flamakta ve bunun i\u00e7in bir IProfileService aray\u00fcz\u00fcn\u00fc sunmaktad\u0131r. Bu i\u00e7eri\u011fimizde ilgili aray\u00fcz\u00fcn nas\u0131l kullan\u0131ld\u0131\u011f\u0131n\u0131 ve bu aray\u00fczden geli\u015ftirilen bir concrete nesnenin sisteme nas\u0131l entegre edildi\u011fini inceleyece\u011fiz.<\/p>\n<p>\u0130lk olarak IProfileService aray\u00fcz\u00fcn\u00fc incelersek e\u011fer<br \/>\n<a href=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2020\/11\/IdentityServer4-Yazi-Serisi-19-\u2013-IProfileService-Arayuzu-Ile-Ozellestirilmis-Claim-Ekleme.jpg\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2020\/11\/IdentityServer4-Yazi-Serisi-19-\u2013-IProfileService-Arayuzu-Ile-Ozellestirilmis-Claim-Ekleme.jpg\" alt=\"IdentityServer4 Yaz\u0131 Serisi #19 \u2013 IProfileService Aray\u00fcz\u00fc \u0130le \u00d6zelle\u015ftirilmi\u015f Claim Ekleme\" width=\"474\" height=\"90\" class=\"aligncenter size-full wp-image-19411\" srcset=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2020\/11\/IdentityServer4-Yazi-Serisi-19-\u2013-IProfileService-Arayuzu-Ile-Ozellestirilmis-Claim-Ekleme.jpg 474w, https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2020\/11\/IdentityServer4-Yazi-Serisi-19-\u2013-IProfileService-Arayuzu-Ile-Ozellestirilmis-Claim-Ekleme-300x57.jpg 300w\" sizes=\"auto, (max-width: 474px) 100vw, 474px\" \/><\/a><br \/>\ng\u00f6r\u00fcld\u00fc\u011f\u00fc \u00fczere &#8216;GetProfileDataAsync&#8217; ve &#8216;IsActiveAsync&#8217; metotlar\u0131n\u0131n imzalar\u0131n\u0131 bar\u0131nd\u0131rmaktad\u0131r.<\/p>\n<p>Bu metotlardan ilki i\u00e7in <a href=\"https:\/\/www.gencayyildiz.com\/blog\/identityserver4-yazi-serisi-12-merkezi-uyelik-sistemi-claim-ve-authentication-propertyleri-okuma\/\" rel=\"noopener noreferrer\" target=\"_blank\">UserInfo Endpoint<\/a>&#8216;inin programatik k\u0131sm\u0131n\u0131 temsil ediyor diyebiliriz. Dinamik olarak claim olu\u015fturma ve ekleme burada ger\u00e7ekle\u015ftirilecektir. \u0130kinci metotta ise genellikle claim eklenecek olan kullan\u0131c\u0131n\u0131n do\u011frulamas\u0131 ger\u00e7ekle\u015ftirilmektedir.<\/p>\n<p>\u015eimdi a\u015fa\u011f\u0131daki \u00f6rnek kodu ele al\u0131rsak;<\/p>\n<pre class=\"brush: jscript; title: ; notranslate\" title=\"\">\r\n    public class CustomProfileService : IProfileService\r\n    {\r\n        public async Task GetProfileDataAsync(ProfileDataRequestContext context)\r\n        {\r\n            \/\/Kullan\u0131c\u0131 veritaban\u0131ndan \u00e7ekilir.\r\n            \/\/context.Subject.GetSubjectId(); -&gt; Subject Id de\u011ferini getirir.\r\n\r\n            var claims = new List&lt;Claim&gt;\r\n            {\r\n                new Claim(JwtRegisteredClaimNames.Email, &quot;gncy@gencayyildiz.com&quot;),\r\n                new Claim(JwtRegisteredClaimNames.Website,&quot;https:\/\/www.gencayyildiz.com&quot;),\r\n                new Claim(&quot;gobekadi&quot;, &quot;Ali&quot;)\r\n            };\r\n\r\n            context.AddRequestedClaims(claims); \/\/Userinfo Token\r\n            context.IssuedClaims = claims; \/\/JWT\r\n        }\r\n\r\n        public async Task IsActiveAsync(IsActiveContext context)\r\n        {\r\n            \/\/Kullan\u0131c\u0131 do\u011frulan\u0131r.\r\n            context.IsActive = true;\r\n        }\r\n    }\r\n<\/pre>\n<p>g\u00f6r\u00fcld\u00fc\u011f\u00fc \u00fczere &#8216;GetProfileDataAsync&#8217; metodu i\u00e7erisinde ideal olan kullan\u0131c\u0131n\u0131n veritaban\u0131ndan \u00e7ekilmesi ve ard\u0131ndan \u00e7ekilen kullan\u0131c\u0131n\u0131n bilgilerinin claim de\u011ferlerine verilmesidir. Aksi taktirde bu \u00f6rnekteki gibi farazi ama\u00e7l\u0131 verilen statik de\u011ferleri kullanmaman\u0131z gerekmektedir. \u00dcretilen claim&#8217;leri ise ya <code>context.AddRequestedClaims(claims)<\/code> komutu e\u015fli\u011finde Userinfo&#8217;ya ekleriz ya da <code>context.IssuedClaims = claims<\/code> komutu ile olu\u015fturulacak JWT&#8217;ye dahil ederiz. Tabi ayn\u0131 anda her ikisini de kullanabilirsiniz.<\/p>\n<p>&#8216;IsActiveAsync&#8217; metodunda ise kullan\u0131c\u0131n\u0131n do\u011frulama sonucu <code>context.IsActive<\/code> property&#8217;sine bildirilmelidir.<\/p>\n<p>Bir di\u011fer dikkat edilmesi gereken husus ise, burada eklenen claim&#8217;lerin identity resource&#8217;lerinin tan\u0131mlanm\u0131\u015f, client taraf\u0131ndan talep edilmi\u015f ve eri\u015filebilir olmas\u0131 gerekmektedir. Yani <a href=\"https:\/\/www.gencayyildiz.com\/blog\/identityserver4-yazi-serisi-16-merkezi-uyelik-sistemi-ozel-identity-resource-ekleme\/\" rel=\"noopener noreferrer\" target=\"_blank\">\u00d6zel Identity Resource Ekleme<\/a> makelesinde yap\u0131lmas\u0131 gereken her\u015feyi bu i\u00e7erikteki stratejiyi benimserkende uygulamam\u0131z gerekmektedir.<\/p>\n<p>Misal olarak biz &#8216;gobekadi&#8217; claim&#8217;inin arkaplandaki in\u015fas\u0131n\u0131 buraya al\u0131rsak;<\/p>\n<ul>\n<li><em><strong>1. Ad\u0131m<\/strong><\/em><br \/>\nIdentity resource tan\u0131mlanmal\u0131,<\/p>\n<pre class=\"brush: jscript; title: ; notranslate\" title=\"\">\r\n        public static IEnumerable&lt;IdentityResource&gt; GetIdentityResources()\r\n        {\r\n            return new List&lt;IdentityResource&gt;\r\n            {\r\n                .\r\n                .\r\n                .\r\n                new IdentityResource{\r\n                    Name = &quot;GobekAdi&quot;,\r\n                    DisplayName = &quot;Gobek ad\u0131&quot;,\r\n                    Description = &quot;G\u00f6bek ad\u0131&quot;,\r\n                    UserClaims = { &quot;gobekadi&quot; }\r\n                }\r\n            };\r\n        }\r\n<\/pre>\n<\/li>\n<li><em><strong>2. Ad\u0131m<\/strong><\/em><br \/>\nClient taraf\u0131ndan ilgili identity resource talep edilmeli,<\/p>\n<pre class=\"brush: jscript; title: ; notranslate\" title=\"\">\r\n        public static IEnumerable&lt;Client&gt; GetClients()\r\n        {\r\n            return new List&lt;Client&gt;\r\n            {\r\n                .\r\n                .\r\n                .\r\n                new Client\r\n                        {\r\n                            .\r\n                            .\r\n                            .\r\n                            AllowedScopes = {\r\n                                .\r\n                                .\r\n                                .\r\n                                &quot;GobekAdi&quot;\r\n                                            },\r\n                        }\r\n            };\r\n        }\r\n<\/pre>\n<\/li>\n<li><em><strong>3. Ad\u0131m<\/strong><br \/>\n\u0130lgili client uygulamas\u0131n\u0131n &#8216;Startup.cs&#8217; dosyas\u0131ndan da talep edilmeli ve json e\u015fle\u015ftirmesi ger\u00e7ekle\u015ftirilmeli,<\/p>\n<pre class=\"brush: jscript; title: ; notranslate\" title=\"\">\r\n            .AddOpenIdConnect(&quot;oidc&quot;, _ =&gt;\r\n            {\r\n                .\r\n                .\r\n                .\r\n                _.Scope.Add(&quot;GobekAdi&quot;);\r\n                _.ClaimActions.MapUniqueJsonKey(&quot;gobekadi&quot;, &quot;gobekadi&quot;);\r\n            });\r\n<\/pre>\n<p><\/em>\n<\/li>\n<\/ul>\n<p>\u0130\u015fte bu kadar&#8230; T\u00fcm yap\u0131lanma bu \u015fekilde in\u015fa edildikten sonra &#8216;IProfileService&#8217; aray\u00fcz\u00fc ile geli\u015ftirilen s\u0131n\u0131f\u0131m\u0131z\u0131 Auth Server&#8217;\u0131n &#8216;Startup.cs&#8217; dosyas\u0131nda &#8216;AddProfileService&#8217; servisi ile uygulamaya dahil ediyoruz.<\/p>\n<pre class=\"brush: jscript; title: ; notranslate\" title=\"\">\r\n            services.AddIdentityServer()\r\n                .AddInMemoryApiResources(Config.GetApiResources())\r\n                .AddInMemoryApiScopes(Config.GetApiScopes())\r\n                .AddInMemoryClients(Config.GetClients())\r\n                .AddTestUsers(Config.GetTestUsers().ToList())\r\n                .AddInMemoryIdentityResources(Config.GetIdentityResources())\r\n                .AddDeveloperSigningCredential()\r\n                .AddProfileService&lt;CustomProfileService&gt;();\r\n<\/pre>\n<p>Velhas\u0131l, ilgili servisin dahil edilmesinden sonra uygulamay\u0131 derleyip, \u00e7al\u0131\u015ft\u0131rd\u0131\u011f\u0131m\u0131zda olu\u015fturulan cookie i\u00e7erisinde belirtilen authentication property&#8217;leri a\u015fa\u011f\u0131daki gibi g\u00f6zlemleyebilmekteyiz.<br \/>\n<a href=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2020\/11\/IdentityServer4-Yazi-Serisi-19-\u2013-IProfileService-Arayuzu-Ile-Ozellestirilmis-Claim-Ekleme-1.jpg\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2020\/11\/IdentityServer4-Yazi-Serisi-19-\u2013-IProfileService-Arayuzu-Ile-Ozellestirilmis-Claim-Ekleme-1.jpg\" alt=\"IdentityServer4 Yaz\u0131 Serisi #19 \u2013 IProfileService Aray\u00fcz\u00fc \u0130le \u00d6zelle\u015ftirilmi\u015f Claim Ekleme\" width=\"523\" height=\"145\" class=\"aligncenter size-full wp-image-19428\" srcset=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2020\/11\/IdentityServer4-Yazi-Serisi-19-\u2013-IProfileService-Arayuzu-Ile-Ozellestirilmis-Claim-Ekleme-1.jpg 523w, https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2020\/11\/IdentityServer4-Yazi-Serisi-19-\u2013-IProfileService-Arayuzu-Ile-Ozellestirilmis-Claim-Ekleme-1-300x83.jpg 300w, https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2020\/11\/IdentityServer4-Yazi-Serisi-19-\u2013-IProfileService-Arayuzu-Ile-Ozellestirilmis-Claim-Ekleme-1-520x145.jpg 520w\" sizes=\"auto, (max-width: 523px) 100vw, 523px\" \/><\/a><\/p>\n<p>Ayriyetten kimlik do\u011frulamadan sonra JWT&#8217;yi elde edip <a href=\"https:\/\/jwt.io\/\" rel=\"noopener noreferrer\" target=\"_blank\">jwt.io<\/a> adresinde incelersek e\u011fer claim&#8217;lerin <code>context.IssuedClaims = claims<\/code> kodu sayesinde ilgili JWT&#8217;ye eklendi\u011fini g\u00f6rebilmekteyiz.<br \/>\n<a href=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2020\/11\/IdentityServer4-Yazi-Serisi-19-\u2013-IProfileService-Arayuzu-Ile-Ozellestirilmis-Claim-Ekleme-2.jpg\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2020\/11\/IdentityServer4-Yazi-Serisi-19-\u2013-IProfileService-Arayuzu-Ile-Ozellestirilmis-Claim-Ekleme-2-295x300.jpg\" alt=\"IdentityServer4 Yaz\u0131 Serisi #19 \u2013 IProfileService Aray\u00fcz\u00fc \u0130le \u00d6zelle\u015ftirilmi\u015f Claim Ekleme\" width=\"295\" height=\"300\" class=\"aligncenter size-medium wp-image-19431\" srcset=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2020\/11\/IdentityServer4-Yazi-Serisi-19-\u2013-IProfileService-Arayuzu-Ile-Ozellestirilmis-Claim-Ekleme-2-295x300.jpg 295w, https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2020\/11\/IdentityServer4-Yazi-Serisi-19-\u2013-IProfileService-Arayuzu-Ile-Ozellestirilmis-Claim-Ekleme-2-768x781.jpg 768w, https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2020\/11\/IdentityServer4-Yazi-Serisi-19-\u2013-IProfileService-Arayuzu-Ile-Ozellestirilmis-Claim-Ekleme-2.jpg 807w\" sizes=\"auto, (max-width: 295px) 100vw, 295px\" \/><\/a><\/p>\n<p>Nihai olarak, IProfileService aray\u00fcz\u00fc sayesinde kullan\u0131c\u0131ya dinamik olarak claim&#8217;ler ekleyebilmekte ve bu claim&#8217;lerin Userinfo bilgileri d\u0131\u015f\u0131nda \u00fcretilecek JWT&#8217;de saklan\u0131p, saklanmayaca\u011f\u0131 karar\u0131n\u0131 verebilmekteyiz.<\/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<!-- AddThis Advanced Settings generic via filter on the_content --><!-- AddThis Share Buttons generic via filter on the_content -->","protected":false},"excerpt":{"rendered":"<p>Merhaba, Makale serimizin bu ondokuzuncu i\u00e7eri\u011fine kadar bir hususun anla\u015f\u0131ld\u0131\u011f\u0131 kanaatindeyim ki, o da, kullan\u0131c\u0131lar hakk\u0131nda kimlik bilgilerinin ciddi \u00f6nem arz etmesidir. Kullan\u0131c\u0131larda claim olarak tutulmakta olan bu bilgileri bizler \u015fu ana kadar \u00f6n&#46;&#46;&#46;<!-- AddThis Advanced Settings generic via filter on get_the_excerpt --><!-- AddThis Share Buttons generic via filter on get_the_excerpt --><\/p>\n","protected":false},"author":1,"featured_media":18168,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[3826],"tags":[3827,3957,3956],"class_list":["post-19408","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-identityserver4","tag-identityserver4","tag-identityserver4-iprofileservice","tag-iprofileservice"],"amp_enabled":true,"_links":{"self":[{"href":"https:\/\/www.gencayyildiz.com\/blog\/wp-json\/wp\/v2\/posts\/19408","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=19408"}],"version-history":[{"count":29,"href":"https:\/\/www.gencayyildiz.com\/blog\/wp-json\/wp\/v2\/posts\/19408\/revisions"}],"predecessor-version":[{"id":19442,"href":"https:\/\/www.gencayyildiz.com\/blog\/wp-json\/wp\/v2\/posts\/19408\/revisions\/19442"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.gencayyildiz.com\/blog\/wp-json\/wp\/v2\/media\/18168"}],"wp:attachment":[{"href":"https:\/\/www.gencayyildiz.com\/blog\/wp-json\/wp\/v2\/media?parent=19408"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.gencayyildiz.com\/blog\/wp-json\/wp\/v2\/categories?post=19408"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.gencayyildiz.com\/blog\/wp-json\/wp\/v2\/tags?post=19408"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}