﻿
{"id":15784,"date":"2020-05-10T01:55:19","date_gmt":"2020-05-10T01:55:19","guid":{"rendered":"https:\/\/www.gencayyildiz.com\/blog\/?p=15784"},"modified":"2020-05-10T01:55:19","modified_gmt":"2020-05-10T01:55:19","slug":"asp-net-core-identity-kullanicinin-cookie-degerini-yenileme","status":"publish","type":"post","link":"https:\/\/www.gencayyildiz.com\/blog\/asp-net-core-identity-kullanicinin-cookie-degerini-yenileme\/","title":{"rendered":"Asp.NET Core Identity &#8211; Kullan\u0131c\u0131n\u0131n Cookie De\u011ferini Yenileme"},"content":{"rendered":"<div id=\"fb-root\"><\/div>\n<p>Merhaba,<\/p>\n<p>Asp.NET Core Identity mekanizmas\u0131 kimli\u011fi do\u011frulanm\u0131\u015f kullan\u0131c\u0131n\u0131n oturum bilgileriyle birlikte mevcut olan t\u00fcm rollerini, yetkilerini ve hatta claim de\u011ferlerini ilgili kullan\u0131c\u0131ya dair hususi olarak olu\u015fturdu\u011fu cookie anahtar de\u011ferinde tutmakta ve ihtiya\u00e7 do\u011frultusunda bu de\u011fer \u00fczerinden istenilen bilgiyi elde etmemizi sa\u011flamaktad\u0131r. Dolay\u0131s\u0131yla kullan\u0131c\u0131 i\u00e7in olu\u015fturulan bu cookie de\u011feri, oturum s\u00fcresi boyunca sistem taraf\u0131ndan kullan\u0131c\u0131n\u0131n s\u0131n\u0131rl\u0131l\u0131klar\u0131n\u0131n alg\u0131lanmas\u0131n\u0131 sa\u011flayarak rol, claim yahut politika bazl\u0131 yetkilendirme s\u00fcre\u00e7lerinde eri\u015fim durumunu de\u011ferlendirmektedir. \u0130\u015fte bu durum olas\u0131 bir a\u00e7\u0131\u011fa kap\u0131 aralamaktad\u0131r. \u015eimdi gelin buradaki a\u00e7\u0131\u011f\u0131n ne oldu\u011funu ve \u00e7\u00f6z\u00fcm olarak ise nas\u0131l refleks geli\u015ftirece\u011fimizi inceleyelim.<\/p>\n<p><strong>Cookie Bazl\u0131 Yetkilendirmenin Olas\u0131 A\u00e7\u0131\u011f\u0131 Nedir?<\/strong><br \/>\nGeli\u015fmi\u015f web uygulamalar\u0131nda kullan\u0131c\u0131 y\u00f6netimleri genellikle bir panel \u00fczerinden ger\u00e7ekle\u015ftirilmekte ve anl\u0131k olarak kullan\u0131c\u0131lara dair yetki, claim yahut role tan\u0131mlamas\u0131 ger\u00e7ekle\u015ftirilebilmektedir. Anl\u0131k olarak ger\u00e7ekle\u015ftirilen rol atamalar\u0131nda hedef kullan\u0131c\u0131n\u0131n \u00f6nceden olu\u015fturdu\u011fu ve farkl\u0131 yetkiye sahip olan cookie de\u011ferini ezmez ya da ge\u00e7ersiz k\u0131lmazsak e\u011fer kullan\u0131c\u0131, eski yetkileriyle donat\u0131lm\u0131\u015f mevcudiyetteki cookie de\u011feri ile oturum s\u00fcresi bitinceye denk uygulamada t\u00fcm eri\u015fimleri sa\u011flamaya devam edecektir. Buda acil durumlarda al\u0131nan ya da atanan yetkilerin ilgili kullan\u0131c\u0131ya oturumu a\u00e7\u0131k oldu\u011fu s\u00fcre\u00e7te yans\u0131t\u0131lmamas\u0131 sonucu ortaya \u00e7\u0131kabilecek bir zarurettir.<\/p>\n<p>Bunun i\u00e7in a\u015fa\u011f\u0131daki g\u00f6rseli inceleyebilirsiniz;<br \/>\n<a href=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2020\/05\/Asp.NET-Core-Identity-Kullan\u0131c\u0131n\u0131n-Cookie-De\u011ferini-Yenileme.gif\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2020\/05\/Asp.NET-Core-Identity-Kullan\u0131c\u0131n\u0131n-Cookie-De\u011ferini-Yenileme.gif\" alt=\"Asp.NET Core Identity - Kullan\u0131c\u0131n\u0131n Cookie De\u011ferini Yenileme\" width=\"800\" height=\"235\" class=\"aligncenter size-full wp-image-15797\" \/><\/a><br \/>\nG\u00f6rselde de g\u00f6r\u00fcld\u00fc\u011f\u00fc \u00fczere sol taraftaki oturum y\u00f6neticiyi, sa\u011f taraftaki oturum ise yetkilendirilmi\u015f kullan\u0131c\u0131y\u0131 temsil etmektedir. Kullan\u0131c\u0131n\u0131n tam yetkiyle donat\u0131lm\u0131\u015f oturumu a\u00e7\u0131k oldu\u011fu esnada y\u00f6netici taraf\u0131ndan yap\u0131lan herhangi bir yetki m\u00fcdahalesi neticesinde bu durum kullan\u0131c\u0131ya an\u0131nda yans\u0131t\u0131lmamakta, dolay\u0131s\u0131yla eski yetkileriyle sisteme eri\u015fime devam edebilmektedir. Bu durum, acil yetkilerin al\u0131nmas\u0131 gerekti\u011fi durumlarda yarataca\u011f\u0131 etkiler a\u00e7\u0131s\u0131ndan en iyi netice veri kayb\u0131yla sonu\u00e7lanacakken, uygulamaya dair kritik arz eden konfig\u00fcrasyonlara temas edilmesi yahut yasal duvarlar\u0131n a\u015f\u0131laca\u011f\u0131 binbir t\u00fcrl\u00fc ki\u015fisel verilerin \u00e7al\u0131nmas\u0131 vs. gibi durumlar\u0131n da meydana gelmesi\/gelebilmesi gibi k\u00f6t\u00fc sonu\u00e7lar\u0131n do\u011fmas\u0131da ihtimaller dahilindedir.<\/p>\n<p><strong>Kullan\u0131c\u0131n\u0131n Cookie De\u011ferini Yenileme<\/strong><br \/>\n\u0130\u015fte b\u00f6yle bir duruma istinaden kullan\u0131c\u0131lar\u0131n yetkileri de\u011fi\u015ftirilir de\u011fi\u015ftirilmez mevcut cookie de\u011ferlerinin ezilerek yerine yenisinin olu\u015fturulmas\u0131 gerekmektedir. Bunun i\u00e7in stratejik olarak kullan\u0131c\u0131n\u0131n her yapt\u0131\u011f\u0131 istek neticesinde o anki mevcut yetkilerini bar\u0131nd\u0131ran yeni bir cookie de\u011feri \u00fcretilmesi bu i\u015flem i\u00e7in en do\u011frusu olacakt\u0131r.<\/p>\n<p><em>Peki nas\u0131l yapaca\u011f\u0131z?<\/em><br \/>\nBir filtre yazarak her istek neticesinde araya girip yeni cookie \u00fcretimini ger\u00e7ekle\u015ftirebiliriz. \u015e\u00f6yle ki;<\/p>\n<pre class=\"brush: jscript; title: ; notranslate\" title=\"\">\r\n    public class RefreshLoginAttribute : ActionFilterAttribute\r\n    {\r\n        \/\/\/ &lt;summary&gt;\r\n        \/\/\/ \r\n        \/\/\/ &lt;\/summary&gt;\r\n        \/\/\/ &lt;param name=&quot;context&quot;&gt;Mevcut context nesnesidir.&lt;\/param&gt;\r\n        \/\/\/ &lt;param name=&quot;next&quot;&gt;\u0130stek g\u00f6nderilen action'\u0131 temsil eden delegate'tir.&lt;\/param&gt;\r\n        \/\/\/ &lt;returns&gt;&lt;\/returns&gt;\r\n        async public override Task OnActionExecutionAsync(ActionExecutingContext context, ActionExecutionDelegate next)\r\n        {\r\n            if (context.HttpContext.User == null)\r\n                return;\r\n\r\n            \/\/UserManager nesnesini elde ediyoruz.\r\n            UserManager&lt;AppUser&gt; userManager = context.HttpContext.RequestServices.GetService(typeof(UserManager&lt;AppUser&gt;)) as UserManager&lt;AppUser&gt;;\r\n\r\n            \/\/SignInManager nesnesini elde ediyoruz.\r\n            SignInManager&lt;AppUser&gt; signInManager = context.HttpContext.RequestServices.GetService(typeof(SignInManager&lt;AppUser&gt;)) as SignInManager&lt;AppUser&gt;;\r\n\r\n            \/\/User'\u0131 elde ediyoruz.\r\n            AppUser user = await userManager.GetUserAsync(context.HttpContext.User);\r\n            \r\n            if (signInManager.IsSignedIn(context.HttpContext.User))\r\n            {\r\n                \/\/E\u011fer user sign olmu\u015fsa ilgili kullan\u0131c\u0131n\u0131n cookie de\u011ferini refresh ediyoruz.\r\n                await signInManager.RefreshSignInAsync(user);\r\n            }\r\n\r\n            \/\/Hedef action'a ak\u0131\u015f\u0131 b\u0131rak\u0131yoruz.\r\n            await next();\r\n        }\r\n    }\r\n<\/pre>\n<p>Olu\u015fturulan bu filtreyi a\u015fa\u011f\u0131daki gibi hedef controllerlarda kullanabiliriz.<\/p>\n<pre class=\"brush: jscript; title: ; notranslate\" title=\"\">\r\n    &#x5B;Authorize(Roles = &quot;Administrator, Moderator, Editor&quot;)]\r\n    &#x5B;RefreshLogin]\r\n    public class HomeController : Controller\r\n    {\r\n<\/pre>\n<pre class=\"brush: jscript; title: ; notranslate\" title=\"\">\r\n    &#x5B;Authorize(Roles = &quot;Administrator&quot;)]\r\n    &#x5B;RefreshLogin]\r\n    public class CategoriesController : Controller\r\n    {\r\n<\/pre>\n<pre class=\"brush: jscript; title: ; notranslate\" title=\"\">\r\n    &#x5B;Authorize(Roles = &quot;Administrator&quot;)]\r\n    &#x5B;RefreshLogin]\r\n    public class UsesController : Controller\r\n    {\r\n<\/pre>\n<pre class=\"brush: jscript; title: ; notranslate\" title=\"\">\r\n    &#x5B;Authorize(Roles = &quot;Administrator&quot;)]\r\n    &#x5B;RefreshLogin]\r\n    public class RolesController : Controller\r\n    {\r\n<\/pre>\n<pre class=\"brush: jscript; title: ; notranslate\" title=\"\">\r\n    &#x5B;Authorize()]\r\n    &#x5B;RefreshLogin]\r\n    public class ProductsController : Controller\r\n    {\r\n<\/pre>\n<pre class=\"brush: jscript; title: ; notranslate\" title=\"\">\r\n    &#x5B;Authorize(Roles = &quot;Administrator, Moderator&quot;)]\r\n    &#x5B;RefreshLogin]\r\n    public class CommentsController : Controller\r\n    {\r\n<\/pre>\n<p>B\u00f6ylece yap\u0131lan her istek neticesinde &#8216;RefreshLogin&#8217; attribute&#8217;u tetiklenecek ve &#8216;RefreshSignInAsync&#8217; metodu ile ilgili kullan\u0131c\u0131n\u0131n cookie de\u011ferini g\u00fcncel roller ve yetkilerle g\u00fcncelleyecektir.<\/p>\n<p><a href=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2020\/05\/Asp.NET-Core-Identity-Kullan\u0131c\u0131n\u0131n-Cookie-De\u011ferini-Yenileme-1.gif\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2020\/05\/Asp.NET-Core-Identity-Kullan\u0131c\u0131n\u0131n-Cookie-De\u011ferini-Yenileme-1.gif\" alt=\"Asp.NET Core Identity - Kullan\u0131c\u0131n\u0131n Cookie De\u011ferini Yenileme\" width=\"600\" height=\"176\" class=\"aligncenter size-full wp-image-15807\" \/><\/a><\/p>\n<p><strong>K\u00fc\u00e7\u00fck Bir \u0130sti\u015fare<\/strong><br \/>\nOlu\u015fturulan &#8216;RefreshLogin&#8217; attribute&#8217;u s\u00fcrekli t\u00fcm isteklerde yeni cookie olu\u015fturmaktad\u0131r. Bu yap\u0131lacak en k\u00fc\u00e7\u00fck i\u015flemler i\u00e7inde ge\u00e7erli olaca\u011f\u0131ndan dolay\u0131 ekstradan maliyet s\u00f6z konusu olabilmektedir. Buradaki maliyeti biraz daha ekonomik hale getirebilmek i\u00e7in ilgili kullan\u0131c\u0131 i\u00e7in veritaban\u0131nda yetki atamaya dair bildiri bar\u0131nd\u0131ran bir kolonda durum bilgisini tutabilir ve buraya yap\u0131lan check neticesinde yeni cookie \u00fcretimini ger\u00e7ekle\u015ftirebilirsiniz.<\/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, Asp.NET Core Identity mekanizmas\u0131 kimli\u011fi do\u011frulanm\u0131\u015f kullan\u0131c\u0131n\u0131n oturum bilgileriyle birlikte mevcut olan t\u00fcm rollerini, yetkilerini ve hatta claim de\u011ferlerini ilgili kullan\u0131c\u0131ya dair hususi olarak olu\u015fturdu\u011fu cookie anahtar de\u011ferinde tutmakta ve ihtiya\u00e7 do\u011frultusunda bu&#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":3223,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[3102,3103],"tags":[3504,2952,3501,3503,3502],"class_list":["post-15784","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-asp-net-core","category-asp-net-core-3-1","tag-asp-net-core-cookie-refresh","tag-asp-net-core-identity","tag-asp-net-core-identity-refresh-cookie","tag-cookie-refresh","tag-user-refresh-cookie"],"amp_enabled":true,"_links":{"self":[{"href":"https:\/\/www.gencayyildiz.com\/blog\/wp-json\/wp\/v2\/posts\/15784","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=15784"}],"version-history":[{"count":24,"href":"https:\/\/www.gencayyildiz.com\/blog\/wp-json\/wp\/v2\/posts\/15784\/revisions"}],"predecessor-version":[{"id":15810,"href":"https:\/\/www.gencayyildiz.com\/blog\/wp-json\/wp\/v2\/posts\/15784\/revisions\/15810"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.gencayyildiz.com\/blog\/wp-json\/wp\/v2\/media\/3223"}],"wp:attachment":[{"href":"https:\/\/www.gencayyildiz.com\/blog\/wp-json\/wp\/v2\/media?parent=15784"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.gencayyildiz.com\/blog\/wp-json\/wp\/v2\/categories?post=15784"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.gencayyildiz.com\/blog\/wp-json\/wp\/v2\/tags?post=15784"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}