﻿
{"id":28964,"date":"2026-11-05T17:12:33","date_gmt":"2026-11-05T17:12:33","guid":{"rendered":"https:\/\/www.gencayyildiz.com\/blog\/?p=28964"},"modified":"2026-11-05T17:12:33","modified_gmt":"2026-11-05T17:12:33","slug":"asp-net-coreda-iticketstore-nedir-ne-amacla-nasil-kullanilir","status":"publish","type":"post","link":"https:\/\/www.gencayyildiz.com\/blog\/asp-net-coreda-iticketstore-nedir-ne-amacla-nasil-kullanilir\/","title":{"rendered":"Asp.NET Core&#8217;da ITicketStore Nedir? Ne Ama\u00e7la, Nas\u0131l Kullan\u0131l\u0131r?"},"content":{"rendered":"<div id=\"fb-root\"><\/div>\n<p><a href=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2026\/11\/Asp.NET-Coreda-ITicketStore-Nedir-Ne-Amacla-Nasil-Kullanilir.png\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2026\/11\/Asp.NET-Coreda-ITicketStore-Nedir-Ne-Amacla-Nasil-Kullanilir.png\" alt=\"Asp.NET Core&#039;da ITicketStore Nedir? Ne Ama\u00e7la, Nas\u0131l Kullan\u0131l\u0131r?\" width=\"1734\" height=\"907\" class=\"aligncenter size-full wp-image-28977\" srcset=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2026\/11\/Asp.NET-Coreda-ITicketStore-Nedir-Ne-Amacla-Nasil-Kullanilir.png 1734w, https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2026\/11\/Asp.NET-Coreda-ITicketStore-Nedir-Ne-Amacla-Nasil-Kullanilir-300x157.png 300w, https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2026\/11\/Asp.NET-Coreda-ITicketStore-Nedir-Ne-Amacla-Nasil-Kullanilir-1024x536.png 1024w, https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2026\/11\/Asp.NET-Coreda-ITicketStore-Nedir-Ne-Amacla-Nasil-Kullanilir-768x402.png 768w, https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2026\/11\/Asp.NET-Coreda-ITicketStore-Nedir-Ne-Amacla-Nasil-Kullanilir-1536x803.png 1536w\" sizes=\"auto, (max-width: 1734px) 100vw, 1734px\" \/><\/a>Merhaba,<br \/>\n<br \/>\nBu i\u00e7eri\u011fimizde, Asp.NET Core mimarisinde kullan\u0131c\u0131ya ait kimlik do\u011frulama oturumunu (authentication ticket) sunucu taraf\u0131nda saklamam\u0131z\u0131 sa\u011flayan <code>ITicketStore<\/code> aray\u00fcz\u00fcn\u00fc ele al\u0131yor olaca\u011f\u0131z.<\/p>\n<h4>ITicketStore Nedir?<\/h4>\n<p>Asp.NET Core mimarisinde, \u00f6zellikle Cookie Authentication kullan\u0131rken, kullan\u0131c\u0131n\u0131n t\u00fcm kimlik bilgilerinin ve claim&#8217;lerinin taray\u0131c\u0131ya g\u00f6nderilen cookie i\u00e7erisinde ta\u015f\u0131maktansa, bu bilgileri Redis, veritaban\u0131 yahut ba\u015fka bir harici depoda tutmak isteyebiliriz.<\/p>\n<blockquote style=\"font-size:14px;\"><p><em><code>ITicketStore<\/code>, do\u011frudan kullan\u0131c\u0131lar\u0131 veya parolalar\u0131 saklamamakta, kullan\u0131c\u0131n\u0131n oturumunu temsil eden <code>AuthenticationTicket<\/code> nesnesini saklamaktad\u0131r. Asp.NET Core ise bu mekanizmay\u0131 <code>CookieAuthenticationOptions.SessionStore<\/code> \u00fczerinden kullanmaktad\u0131r.<\/em><\/p><\/blockquote>\n<p>Normal Cookie Authentication ak\u0131\u015f\u0131n\u0131 d\u00fc\u015f\u00fcn\u00fcrsek e\u011fer; kullan\u0131c\u0131 giri\u015f yapar, <code>AuthenticationTicket<\/code>(\u015fifrelenmi\u015f ve imzalanm\u0131\u015f kimlik bilgileri, claim&#8217;ler ve oturum \u00f6zellikleri) cookie&#8217;ye yaz\u0131l\u0131r ve taray\u0131c\u0131 her istekte cookie&#8217;yi g\u00f6nderir. Bu y\u00f6ntem \u00e7o\u011fu uygulama i\u00e7in gayet yeterli olsa da esas\u0131nda kullan\u0131c\u0131ya ait \u00e7ok say\u0131da claim, rol, yetki vs. bilgileri cookie&#8217;nin yersiz \u015fekilde b\u00fcy\u00fcmesine neden olabilmektedir. Bu da taray\u0131c\u0131lar\u0131n, proxy&#8217;lerin ve sunucular\u0131n header boyut s\u0131n\u0131rlar\u0131 y\u00fcz\u00fcnden request s\u00fcre\u00e7lerinde sorun olarak kar\u015f\u0131m\u0131za \u00e7\u0131kabilmektedir.<\/p>\n<p>\u0130\u015fte b\u00f6yle bir durumda <code>ITicketStore<\/code> devreye girer ve ak\u0131\u015f de\u011fi\u015fir&#8230;<\/p>\n<p><code>ITicketStore<\/code> ile s\u00fcre\u00e7 \u015f\u00f6yle cereyan eder&#8230; Kullan\u0131c\u0131 giri\u015f yapar, <code>AuthenticationTicket<\/code> sunucu taraf\u0131ndan Redis&#8217;e aktar\u0131l\u0131r ve taray\u0131c\u0131ya cookie g\u00f6nderilir. Tabi burada cookie, kullan\u0131c\u0131n t\u00fcm bilgilerini de\u011fil session key&#8217;ini ta\u015f\u0131yacakt\u0131r. B\u00f6ylece sunucu kullan\u0131c\u0131n\u0131n kim oldu\u011funu hat\u0131rl\u0131yor olsa da, taray\u0131c\u0131 sadece onu hat\u0131rlayacak key&#8217;i tutacakt\u0131r. Nihai olarak kullan\u0131c\u0131dan gelen her istek cebinde session key e\u015fli\u011finde ticket bar\u0131nd\u0131r\u0131yor olacakt\u0131r. Asp.NET Core mimarisi ise bu session key&#8217;i al\u0131p ticket&#8217;\u0131 Redis&#8217;ten bulacak ve kullan\u0131c\u0131y\u0131 do\u011frulayacakt\u0131r.<\/p>\n<blockquote style=\"font-size:14px;\"><p><em>Bu yakla\u015f\u0131mdaki en b\u00fcy\u00fck avantaj, kullan\u0131c\u0131n\u0131n oturumunu sunucudan silebilme imkan\u0131n\u0131n s\u00f6z konusu olmas\u0131d\u0131r. Session key Redis&#8217;ten silinirse, o oturumla gelen sonraki istekler do\u011frulanmayacakt\u0131r&#8230;<\/em><\/p><\/blockquote>\n<h4>Hangi Durumlarda Kullan\u0131l\u0131r?<\/h4>\n<p><code>ITicketStore<\/code>, \u00f6zellikle kullan\u0131c\u0131 oturumlar\u0131n\u0131n sunucu taraf\u0131nda y\u00f6netilmesini istedi\u011fimiz t\u00fcm durumlarda tercih edilebilir.<\/p>\n<p>\u00d6ncelikle, kullan\u0131c\u0131ya ait kimlik bilgileri ve claim&#8217;ler cookie i\u00e7erisinde ta\u015f\u0131nmak yerine Redis yahut veritaban\u0131 gibi bir depoda sakland\u0131\u011f\u0131 i\u00e7in cookie boyutunun k\u00fc\u00e7\u00fclmesini sa\u011flayacakt\u0131r<\/p>\n<p>Bunun yan\u0131nda, kullan\u0131c\u0131 oturumlar\u0131n\u0131n sunucu \u00fczerinden kontrol edilmesine ve gerekti\u011finde ge\u00e7ersiz k\u0131l\u0131nmas\u0131na imkan tan\u0131yacakt\u0131r. \u00d6rne\u011fin, bir kullan\u0131c\u0131n\u0131n oturumunu Redis&#8217;ten silerek sonraki isteklerinde kimlik do\u011frulamas\u0131n\u0131n ba\u015far\u0131s\u0131z olmas\u0131n\u0131 sa\u011flayabiliriz.<\/p>\n<p>Ayr\u0131ca birden fazla uygulama sunucusunun (instance) \u00e7al\u0131\u015ft\u0131\u011f\u0131 distributed mimarilerde, ortak bir Redis veya veritaban\u0131 kullanarak oturumlar\u0131n t\u00fcm sunucular taraf\u0131ndan eri\u015filebilir olmas\u0131n\u0131 da sa\u011flayacakt\u0131r.<\/p>\n<p>T\u00fcm bunlar\u0131n aksine <code>ITicketStore<\/code>&#8216;un, kullan\u0131c\u0131 ad\u0131 ve parola gibi kimlik bilgilerini y\u00f6neten bir kullan\u0131c\u0131 veritaban\u0131 olmad\u0131\u011f\u0131n\u0131 ve JET Bearer token do\u011frulama mekanizmas\u0131n\u0131n da yerine ge\u00e7meyece\u011fini s\u00f6ylemekte fayda g\u00f6rmekteyim. Bu yap\u0131, yaln\u0131zca Asp.NET Core&#8217;un <a href=\"https:\/\/www.gencayyildiz.com\/blog\/asp-net-core-identity-cookie-bazli-kimlik-dogrulama-ix\/\" target=\"_blank\">Cookie Authentication<\/a> mekanizmas\u0131yla birlikte \u00e7al\u0131\u015fmaktad\u0131r.<\/p>\n<h4>Nas\u0131l Kullan\u0131l\u0131r?<\/h4>\n<p><code>ITicketStore<\/code>&#8216;un mant\u0131\u011f\u0131n\u0131 anlayabilmek i\u00e7in basit bir \u00e7al\u0131\u015fma \u00fczerinden incelemede bulunmam\u0131z yeterli olacakt\u0131r.<\/p>\n<p>Bunun i\u00e7in \u00f6ncelikle <code>ITicketStore<\/code> implementasyonunun a\u015fa\u011f\u0131daki gibi ger\u00e7ekle\u015ftirilmesi gerekir:<\/p>\n<div style=\"font-size:12px;\">\n<pre class=\"brush: jscript; title: ; notranslate\" title=\"\">\r\n    public class RedisTicketStore : ITicketStore\r\n    {\r\n        \/\/ Redis ba\u011flant\u0131s\u0131 i\u00e7in IDatabase instance'\u0131n\u0131 tutar.\r\n        private readonly IDatabase _database;\r\n        \/\/ Ticket'\u0131n default ge\u00e7erlilik s\u00fcresi 8 saat olarak ayarlanm\u0131\u015ft\u0131r. E\u011fer ticket'\u0131n Properties.ExpiresUtc de\u011feri null ise, bu default s\u00fcre kullan\u0131l\u0131r.\r\n        private readonly TimeSpan _defaultExpiration = TimeSpan.FromHours(8);\r\n\r\n        public RedisTicketStore(IConnectionMultiplexer connectionMultiplexer)\r\n            =&gt; _database = connectionMultiplexer.GetDatabase();\r\n\r\n        \/\/ Verilen key'e ait ticket'\u0131 Redis'ten siler.\r\n        public async Task RemoveAsync(string key)\r\n            =&gt; await _database.KeyDeleteAsync(key);\r\n\r\n        \/\/ Ticket'\u0131 g\u00fcnceller\/yeniler ve ticket'\u0131n biti\u015f zaman\u0131n\u0131 hesaplar, kalan s\u00fcreyi bulur. S\u00fcre dolmu\u015fsa kayd\u0131 siler; dolmam\u0131\u015fsa bileti kalan s\u00fcre kadar bir TTL (ya\u015fam s\u00fcresi) ile Redis'e yazar.\r\n        public async Task RenewAsync(string key, AuthenticationTicket ticket)\r\n        {\r\n            var serializedTicket = TicketSerializer.Default.Serialize(ticket);\r\n            var expiration = ticket.Properties.ExpiresUtc ?? DateTimeOffset.UtcNow.Add(_defaultExpiration);\r\n            var remainingTime = expiration - DateTimeOffset.UtcNow;\r\n\r\n            if (remainingTime &lt;= TimeSpan.Zero)\r\n            {\r\n                await _database.KeyDeleteAsync(key);\r\n                return;\r\n            }\r\n\r\n            await _database.StringSetAsync(key, serializedTicket, remainingTime);\r\n        }\r\n        \/\/ Verilen key ile Redis'ten ticket'\u0131 okur, bo\u015fsa null d\u00f6ner, varsa deserialize edip AuthenticationTicket olarak geri verir.\r\n        public async Task&lt;AuthenticationTicket?&gt; RetrieveAsync(string key)\r\n        {\r\n            var value = await _database.StringGetAsync(key);\r\n\r\n            if (value.IsNullOrEmpty)\r\n                return null;\r\n\r\n            return TicketSerializer.Default.Deserialize(value!);\r\n        }\r\n\r\n        \/\/ RandomNumberGenerator ile kriptografik olarak g\u00fcvenli, rastgele 32 byte'l\u0131k bir key \u00fcretip, bu key e\u015fli\u011finde AuthenticationTicket'\u0131 Redis'e kaydeder ve key'i d\u00f6nd\u00fcr\u00fcr.\r\n        public async Task&lt;string&gt; StoreAsync(AuthenticationTicket ticket)\r\n        {\r\n            var key = Convert.ToHexString(RandomNumberGenerator.GetBytes(32));\r\n\r\n            await RenewAsync(key, ticket);\r\n\r\n            return key;\r\n        }\r\n    }\r\n<\/pre>\n<\/div>\n<p>Buradaki yap\u0131lan \u00e7al\u0131\u015fmada \u00f6nemli bir ayr\u0131nt\u0131 mevcuttur. <em>38.<\/em> sat\u0131rda oldu\u011fu gibi <code>AuthenticationTicket<\/code> nensesini JSON ile serialize etmek yerine Asp.NET Core&#8217;un kendi <code>TicketSerializer<\/code> s\u0131n\u0131f\u0131 kullan\u0131lmaktad\u0131r. B\u00f6ylece ticket i\u00e7erisindeki authentication properties, claims ve identity bilgileri uygun bi\u00e7imde saklanabilmektedir.<\/p>\n<p>\u015eimdi <code>ITicketStore<\/code> aray\u00fcz\u00fcn\u00fc implement etti\u011fimiz <code>RedisTicketStore<\/code> s\u0131n\u0131f\u0131n\u0131 cookie authentication ile ili\u015fkilendirelim. Bunun i\u00e7in <em>Program.cs<\/em> dosyas\u0131na gelelim ve a\u015fa\u011f\u0131daki yap\u0131land\u0131rmalar\u0131 ger\u00e7ekle\u015ftirelim:<\/p>\n<div style=\"font-size:12px;\">\n<pre class=\"brush: jscript; title: ; notranslate\" title=\"\">\r\n#region Redis Connection\r\nvar redisConnectionString = builder.Configuration.GetConnectionString(&quot;Redis&quot;) ?? &quot;localhost:6379&quot;;\r\nbuilder.Services.AddSingleton&lt;IConnectionMultiplexer&gt;(serviceProvider =&gt; ConnectionMultiplexer.Connect(redisConnectionString));\r\n#endregion\r\n\r\nbuilder.Services.AddSingleton&lt;ITicketStore, RedisTicketStore&gt;();\r\nbuilder.Services.AddSingleton&lt;IPostConfigureOptions&lt;CookieAuthenticationOptions&gt;, ConfigureCookieAuthenticationOptions&gt;();\r\n\r\nbuilder.Services.AddAuthentication(CookieAuthenticationDefaults.AuthenticationScheme)\r\n    .AddCookie(options =&gt;\r\n    {\r\n        options.LoginPath = &quot;\/Account\/Login&quot;;\r\n        options.LogoutPath = &quot;\/Account\/Logout&quot;;\r\n\r\n        options.ExpireTimeSpan = TimeSpan.FromHours(8);\r\n        options.SlidingExpiration = true;\r\n    });\r\n\r\nbuilder.Services.AddAuthorization();\r\n<\/pre>\n<\/div>\n<p>Burada g\u00f6r\u00fcld\u00fc\u011f\u00fc \u00fczere Redis ile birlikte temel cookie yap\u0131land\u0131rmalar\u0131 ger\u00e7ekle\u015ftirilmektedir. Ancak <em>7.<\/em> sat\u0131ra g\u00f6z atarsan\u0131z e\u011fer <code>CookieAuthenticationOptions<\/code> nesnesi yap\u0131land\u0131r\u0131l\u0131rken, bir yandan da <code>ConfigureCookieAuthenticationOptions<\/code> s\u0131n\u0131f\u0131m\u0131z\u0131 son ayar (yani past-configure) ad\u0131m\u0131 olarak \u00e7al\u0131\u015ft\u0131rmas\u0131n\u0131 istemekteyiz. B\u00f6ylece <code>AddCookie(options => ...)<\/code> i\u00e7indeki ayarlar\u0131n (veyahut ba\u015fka herhangi bir Configure ad\u0131m\u0131n\u0131n) <em>SessionStore<\/em>&#8216;u ezme ihtimali kalmayacakt\u0131r. Yani <em>PostConfigure<\/em> en son \u00e7al\u0131\u015faca\u011f\u0131 i\u00e7in son s\u00f6z\u00fc s\u00f6yleyecektir.<\/p>\n<p><code>ConfigureCookieAuthenticationOptions<\/code> i\u00e7eri\u011fine gelirsek e\u011fer;<\/p>\n<div style=\"font-size:12px;\">\n<pre class=\"brush: jscript; title: ; notranslate\" title=\"\">\r\n    public class ConfigureCookieAuthenticationOptions(ITicketStore ticketStore) : IPostConfigureOptions&lt;CookieAuthenticationOptions&gt;\r\n    {\r\n        public void PostConfigure(string? name, CookieAuthenticationOptions options)\r\n            =&gt; options.SessionStore = ticketStore;\r\n    }\r\n<\/pre>\n<\/div>\n<p>Bu s\u0131n\u0131f <code>RedisTicketStore<\/code>&#8216;u (<code>ITicketStore<\/code>), cookie authentication&#8217;\u0131n <em>SessionStore<\/em> \u00f6zelli\u011fine ba\u011flamaktad\u0131r. B\u00f6ylece kimlik ticket&#8217;lar\u0131 taray\u0131c\u0131 cookie&#8217;sinde de\u011fil, Redis sunucusunda saklanacak, cookie sadece session key&#8217;i ta\u015f\u0131yacakt\u0131r.<\/p>\n<p>Art\u0131k bu vaziyette yap\u0131land\u0131r\u0131lm\u0131\u015f bir projede a\u015fa\u011f\u0131daki gibi <code>SignInAsync<\/code> \u00e7a\u011fr\u0131s\u0131, <em>SessionStore<\/em> olarak yap\u0131land\u0131rd\u0131\u011f\u0131m\u0131z <code>RedisTicketStore<\/code> \u00fczerinden <code>StoreAsync<\/code> metodunu tetikleyecektir.<\/p>\n<div style=\"font-size:12px;\">\n<pre class=\"brush: jscript; title: ; notranslate\" title=\"\">\r\nawait HttpContext.SignInAsync(CookieAuthenticationDefaults.AuthenticationScheme, principal, authProperties);\r\n<\/pre>\n<\/div>\n<p>Ve a\u015fa\u011f\u0131daki gibi <code>Authorize<\/code> attribute&#8217;unun kullan\u0131ld\u0131\u011f\u0131 action&#8217;lara her eri\u015fim s\u00fcre\u00e7lerinde ise yine <code>RedisTicketStore<\/code>&#8216;un <code>RetrieveAsync<\/code> metodunu \u00e7a\u011f\u0131racakt\u0131r.<\/p>\n<div style=\"font-size:12px;\">\n<pre class=\"brush: jscript; title: ; notranslate\" title=\"\">\r\n        &#x5B;Authorize]\r\n        public IActionResult Privacy()\r\n        {\r\n            return View();\r\n        }\r\n<\/pre>\n<\/div>\n<p>\u0130\u015fte bu kadar&#8230;<\/p>\n<p>Nihai olarak,<\/p>\n<p><code>ITicketStore<\/code>, Cookie Authentication mekanizmas\u0131n\u0131 sunucu tarafl\u0131 bir oturum y\u00f6netimine d\u00f6n\u00fc\u015ft\u00fcrerek, hem cookie boyutunu k\u00fc\u00e7\u00fcltmekte hem de oturumlar \u00fczerinde tam kontrol sa\u011flamaktad\u0131r. Haliyle do\u011fru kullan\u0131ld\u0131\u011f\u0131 taktirde \u00f6l\u00e7eklenebilir ve g\u00fcvenli kimlik do\u011frulama mimarilerinin vazge\u00e7ilmez par\u00e7alar\u0131ndan biri olmaktad\u0131r diyebiliriz.<\/p>\n<p>\u0130lgilenenlerin faydalanmas\u0131 dile\u011fiyle&#8230;<br \/>\nSonraki yaz\u0131lar\u0131m\u0131zda g\u00f6r\u00fc\u015fmek \u00fczere&#8230;<br \/>\n\u0130yi \u00e7al\u0131\u015fmalar&#8230;<\/p>\n<div style=\"max-width:720px;margin:24px auto;padding:18px 20px;border-radius:12px;background:linear-gradient(135deg,#0d1117,#161b22);border:1px solid #30363d;font-family:-apple-system,BlinkMacSystemFont,'Segoe UI',Roboto,Arial,sans-serif;color:#e6edf3;box-shadow:0 10px 30px rgba(0,0,0,.35);\">\n<div style=\"display:flex;align-items:center;gap:14px;margin-bottom:12px;\">\n    <svg style=\"width:34px;height:34px;fill:#58a6ff;flex-shrink:0;\" viewBox=\"0 0 16 16\" aria-hidden=\"true\">\n      <path d=\"M8 0C3.58 0 0 3.58 0 8c0 3.54 2.29 6.53 5.47 7.59.4.07.55-.17.55-.38 0-.19-.01-.82-.01-1.49-2.01.37-2.53-.49-2.69-.94-.09-.23-.48-.94-.82-1.13-.28-.15-.68-.52-.01-.53.63-.01 1.08.58 1.23.82.72 1.21 1.87.87 2.33.66.07-.52.28-.87.51-1.07-1.78-.2-3.64-.89-3.64-3.95 0-.87.31-1.59.82-2.15-.08-.2-.36-1.02.08-2.12 0 0 .67-.21 2.2.82a7.65 7.65 0 012-.27c.68 0 1.36.09 2 .27 1.53-1.04 2.2-.82 2.2-.82.44 1.1.16 1.92.08 2.12.51.56.82 1.27.82 2.15 0 3.07-1.87 3.75-3.65 3.95.29.25.54.73.54 1.48 0 1.07-.01 1.93-.01 2.2 0 .21.15.46.55.38A8.013 8.013 0 0016 8c0-4.42-3.58-8-8-8z\"><\/path>\n    <\/svg><\/p>\n<div>\n<div style=\"font-size:18px;font-weight:600;line-height:1.2;\">\u00d6rnek \u00e7al\u0131\u015fmaya a\u015fa\u011f\u0131daki GitHub reposundan eri\u015febilirsiniz.<\/div>\n<div style=\"font-size:13px;color:#8b949e;\">https:\/\/github.com\/gncyyldz\/ITicketStoreImplementation<\/div>\n<\/p><\/div>\n<\/p><\/div>\n<div style=\"font-size:14px;line-height:1.6;color:#c9d1d9;margin-bottom:14px;\">\n    Bu repository, ilgili konuya dair \u00f6rnek \u00e7al\u0131\u015fman\u0131n kaynak kodlar\u0131n\u0131 ve mimari yap\u0131s\u0131n\u0131 i\u00e7ermektedir. Detaylar i\u00e7in GitHub \u00fczerinden incelemede bulunabilirsiniz.\n  <\/div>\n<p>  <a href=\"https:\/\/github.com\/gncyyldz\/ITicketStoreImplementation\" target=\"_blank\" rel=\"noopener noreferrer\"\n     style=\"display:inline-block;padding:10px 16px;border-radius:8px;background:#238636;color:#ffffff;text-decoration:none;font-size:14px;font-weight:600;transition:all .2s ease;\"><br \/>\n    GitHub\u2019da G\u00f6r\u00fcnt\u00fcle \u2192<br \/>\n  <\/a><\/p>\n<\/div>\n<!-- AddThis Advanced Settings generic via filter on the_content --><!-- AddThis Share Buttons generic via filter on the_content -->","protected":false},"excerpt":{"rendered":"<p>Merhaba, Bu i\u00e7eri\u011fimizde, Asp.NET Core mimarisinde kullan\u0131c\u0131ya ait kimlik do\u011frulama oturumunu (authentication ticket) sunucu taraf\u0131nda saklamam\u0131z\u0131 sa\u011flayan ITicketStore aray\u00fcz\u00fcn\u00fc ele al\u0131yor olaca\u011f\u0131z. ITicketStore Nedir? Asp.NET Core mimarisinde, \u00f6zellikle Cookie Authentication kullan\u0131rken, kullan\u0131c\u0131n\u0131n t\u00fcm kimlik&#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":28977,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[5206,3102],"tags":[5773,5772],"class_list":["post-28964","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-net","category-asp-net-core","tag-cookie-authentication","tag-iticketstore"],"amp_enabled":true,"_links":{"self":[{"href":"https:\/\/www.gencayyildiz.com\/blog\/wp-json\/wp\/v2\/posts\/28964","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=28964"}],"version-history":[{"count":9,"href":"https:\/\/www.gencayyildiz.com\/blog\/wp-json\/wp\/v2\/posts\/28964\/revisions"}],"predecessor-version":[{"id":28979,"href":"https:\/\/www.gencayyildiz.com\/blog\/wp-json\/wp\/v2\/posts\/28964\/revisions\/28979"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.gencayyildiz.com\/blog\/wp-json\/wp\/v2\/media\/28977"}],"wp:attachment":[{"href":"https:\/\/www.gencayyildiz.com\/blog\/wp-json\/wp\/v2\/media?parent=28964"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.gencayyildiz.com\/blog\/wp-json\/wp\/v2\/categories?post=28964"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.gencayyildiz.com\/blog\/wp-json\/wp\/v2\/tags?post=28964"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}