HTTP, durum bilgisi olmayan (stateless) bir protokoldür. Ek işlemler yapmadan, bir HTTP isteği tüm kullanıcılara aynı sonucu döndürür çünkü bir HTTP isteği içinde kullanıcıya özel bir değer tutulmaz. Bu yazı, bir kullanıcı veya uygulama verisi korumak için çeşitli yaklaşımları tanıtacaktır.
Bir durum (kullanıcı veya uygulama verisi) bir kaç farklı yaklaşımla depolanabilir.
- Cookies: sunucu tarafı uygulama kodu kullanılarak saklanan verileri içerebilir.
- Session state: HTTP cookies ve sunucu tarafı uygulama kodu
- TempData: HTTP cookies ve session durumu
- QueryStrings: HTTP query strings
- Hidden fields: HTTP form alanları
- HttpContext.Items: Sunucu tarafı uygulama kodu
- Cache: Sunucu tarafı uygulama kodu
- Dependency Injection: Sunucu tarafı uygulama kodu
03.01. Cookies
Cookies, isteklere göre depolanır ve taşınır. Cookies her istek ile gönderildiği için, büyüklükleri minimumda tutulmalıdır. İdeal olarak, bir tanımlayıcı, uygulama tarafından saklanan verilerle bir cookie’lerde saklanmalıdır. Çoğu tarayıcı çerez boyutunu 4096 bayta sınırlar. Her web domain’i için yalnızca sınırlı sayıda cookie kullanılabilir.
Cookie sunucu ve istemci tarafında dolaştığı için bir hacker’ın kurcalamayı düşündüğü kısımlardan biridir. Cookieler kullanıcı tarafından veya tarayıcı üzerinden silinebilir. Hatta, cookie’in süresi dolmuş olabilir. Ancak, bir cookie silinmediği ve süresi dolmadığı sürece istemci tarafında en kalıcı veri türüdür. Bir cookie, bir kullanıcıyı özelliştirmek için kullanılır. Bu açıdan cookie içinde o kullanıcıya özel kayıtlar (kullanıcı ismi, kullanıcı türü, hesap adı ve kullanıcının benzersiz anahtar değeri gibi) taşınmalıdır. Bir cookie’de istenirse kişileştirme ayarları (arka plan rengi, font büyüklüğü gibi) verilerde taşınabilir. Önemli verilerin şifrelenmesinde yarar vardır. Sadece sunucu taraflı kullanıcı işlem verileri (kullanıcı benzersiz anahtar değeri gibi) şifrelenebilir. Güvenlik hakkında daha fazla bilgi için tıklayın. Konu hakkında daha fazla bilgi için tıklayın.
03.02. Session durumu
Session durumu, kullanıcı bir web uygulamasında gezinirken kullanıcı verilerinin depolanması için bir ASP.NET Core senaryosudur. Session durumu, bir istemciden gelen isteklerdeki verileri sürdürmek için uygulama tarafından sağlanan bir depolama yeri kullanır. Session verileri bir önbellek ile desteklenir ve geçici veriler olarak kabul edilir – site oturum verileri olmadan çalışmaya devam etmelidir. Bir ASP.NET MVC Core uygulaması olan SignalIR session durumu desteklemez.
ASP.NET Core, her istekte uygulamaya gönderilen bir session kimliğini içeren istemciye bir çerez sağlayarak session durumunu korur. Uygulama, session verilerini almak için oturum kimliğini kullanır. Session durumu aşağıdaki davranışları sergiler:
- Session cookie tarayıcıya özel olduğundan, oturumlar farklı tarayıcılarda paylaşılmaz. Örneğin, Edge’den bir oturum açınca Chrome üzerinden bağlanınca mevcut oturum devam etmez.
- Bir tarayıcı da oturum sona erdiğinde session cookie silinir.
- Süresi dolmuş bir oturum için bir cookie alınırsa, aynı session cookie kullanan yeni bir session oluşturulur.
- Boş bir session korunmaz; session isteklerin karşı karşıya gelmesi için oturumda en az bir değerin olması gerekir. Bir session korunmazsa, her yeni istek için yeni bir session ID oluşturulur.
- Uygulama, son isteğin ardından sınırlı bir süre için bir session’ı korur. Uygulama, session zaman aşımını (timeout) belirlenen bir değeri ayarlar ya da 20 dakika varsayılan değerini kullanır. Sesssion state, belirli bir session’a özgü, ancak verilerin sesison’lar arasında kalıcı depolama gerektirmediği kullanıcı verilerini depolamak için idealdir.
- Session verileri, ISession.Clear uygulaması çağrıldığında veya session süresi dolduğunda silinir.
- Uygulama kodunu, bir istemci tarayıcısının kapatıldığını veya session cookie silindiğinde veya istemcide süresi dolduğunda bilgilendirmek için varsayılan bir mekanizma yoktur. Tekrar klasik bir isteğin gönderilmesi gerekir.
Session verisi çok fazla başvurulan bir veri olduğu için bu verilerin bellek üzerinde saklanması önerilir. Bu noktada en iyi yaklaşım: Resis veya SQL Server dağıtık cache mekanizmasıdır. Diğer taraftan, bir session cookie IDataProtector ile şifrelenebilir. Veri koruma işi önemli bir süreçtir.
03.02.01. Uygulama tarafı
Microsoft.AspNetCore.App metapackage içinde bulunan Microsoft.AspNetCore.Session paketi, session durumu yönetmek için ara katman bir yazılım sağlar. Oturum ara katmanını etkinleştirmek için, Startup.cs dosyası şunları içermelidir:
- IDistributedCache belleğinin bir önbellek
- Addsession bir çağrı
- UseSession bir çağrı
Aşağıdaki kod örnek bir Startup.cs dosyasına aittir.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 |
public class Startup { public void ConfigureServices(IServiceCollection services) { services.Configure<CookiePolicyOptions>(options => { options.CheckConsentNeeded = context => true; options.MinimumSameSitePolicy = SameSiteMode.None; }); services.AddDistributedMemoryCache(); services.AddSession(options => { // Set a short timeout for easy testing. options.IdleTimeout = TimeSpan.FromSeconds(10); options.Cookie.HttpOnly = true; }); services.AddMvc() .SetCompatibilityVersion(CompatibilityVersion.Version_2_1); } public void Configure(IApplicationBuilder app, IHostingEnvironment env) { if (env.IsDevelopment()) { app.UseDeveloperExceptionPage(); } else { app.UseExceptionHandler("/Error"); app.UseHsts(); } app.UseHttpsRedirection(); app.UseStaticFiles(); app.UseCookiePolicy(); app.UseSession(); app.UseHttpContextItemsMiddleware(); app.UseMvc(); } } |
AddDistributedMemoryCache ile bellekten bir alan session işlemleri için ayrılmıştır. AddSession ile bir session eklenmiş ve Usesession ile de kullanılmıştır. Bir session üç temel bilgi içerir:
- Cookie: Cookie yaratmada kullanılan ayarları belirler. SessionDefaults.CookieName geçerli değeri .AspNetCore.Session’dir.
- IdleTimeout: Session süresini belirler. Her istekte session süresi baştan başlar. Örneğin, session süresi 20 dakika olsun. Kullanıcı 20 dakika içinde tekrar bağlanırsa tekrar 20 dakika aktif olur.
- IOTimeout: Bir session yüklenmesi veya elde edilmesi için verilecek maksimum süreyi belirler.
Bir session durumuna Razor sayfası veya MVC controller sınıfı üzerinden HttpContext.Session ile erişilir. Bu özellik ISession uygulamasıdır. Bu sınıflar bir controller dosyasında aşağıdaki gibi kullanılabilir.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 |
public class IndexModel : PageModel { public const string SessionKeyName = "_Name"; public const string SessionKeyAge = "_Age"; const string SessionKeyTime = "_Time"; public string SessionInfo_Name { get; private set; } public string SessionInfo_Age { get; private set; } public string SessionInfo_CurrentTime { get; private set; } public string SessionInfo_SessionTime { get; private set; } public string SessionInfo_MiddlewareValue { get; private set; } public void OnGet() { // Requires: using Microsoft.AspNetCore.Http; if (string.IsNullOrEmpty(HttpContext.Session.GetString(SessionKeyName))) { HttpContext.Session.SetString(SessionKeyName, "The Doctor"); HttpContext.Session.SetInt32(SessionKeyAge, 773); } var name = HttpContext.Session.GetString(SessionKeyName); var age = HttpContext.Session.GetInt32(SessionKeyAge); |
Bir Razor sayfasından aşağıdaki gibi çağrılabilir.
1 2 3 4 5 6 7 |
@page @using Microsoft.AspNetCore.Http @model IndexModel ... Name: @HttpContext.Session.GetString(IndexModel.SessionKeyName) |
03.03. TempData
ASP.NET Core, Bir Razor Pages page model veya bir MVC controller’ın TempData özelliğini kullanabilir. Bu özellik, okunana kadar veri depolar. TempData, birden fazla istekten veri gerektiğinde özellikle yeniden yönlendirme için özellikle kullanışlıdır.
03.04. Query Strings (Sorgu dizesi)
Sınırlı miktarda veri, yeni isteğin sorgusuna ekleyerek bir istekten diğerine geçirilebilir. (Browser üzerindeki linkte bu veriler taşınabilir) Bu, yerleşik durumun e-posta veya sosyal ağlar aracılığıyla paylaşılmasına izin veren kalıcı bir şekilde durumun yakalanması için kullanışlıdır. URL query strings herkese açık olduğundan, hassas veriler için asla query string kullanmayın. Ayrıca, Query Strings bölümünün Cross-Site Request Forgery (CSRF) ataklara açık olduğunu unutmayın. Daha fazla güvenlik bilgisi için tıklayın.
03.05. Hidden fields (Gizli alanlar)
Veriler hidden form alanlarında saklanabilir ve bir sonraki istek üzerine geri gönderilebilir. Bu çok sayfalı formlarda yaygındır. İstemci potansiyel olarak veriyi kurcalayabildiği için, uygulama her zaman gizli alanlarda saklanan verileri yeniden doğrulamalıdır. Bu arada kelime olarak gizli olsa da HTML içinde gözüken alanlardır. Genelde şifreli veri tutar. (Google’ı açın, kaynak kodu açıp, hidden kelimesini aratın.)
03.06. HttpContext.Items
HttpContext.Items koleksiyonu, tek bir isteği işlerken veri depolamak için kullanılır. Bir istek işlendikten sonra koleksiyonun içeriği atılır. Öğeler koleksiyonu genellikle, bir istek sırasında farklı noktalarda çalıştıklarında ve parametreleri geçirmenin doğrudan bir yolu olmadığında, bileşenlerin veya ara katman yazılımının iletişim kurmasına izin vermek için kullanılır. Daha fazla bilgi için tıklayın.
03.07. Cache
Caching (Ön belleğe alma) verileri depolamak ve almak için etkili bir yoldur. Uygulama, önbelleğe alınmış öğelerin ömrünü kontrol edebilir. Önbellekteki veriler belirli bir istek, kullanıcı veya session ile ilişkilendirilmez. Diğer kullanıcıların istekleri tarafından alınabilecek kullanıcıya özgü verileri önbelleğe almamaya dikkat edin. Daha fazla bilgi için tıklayın.
03.08. Dependency Injection
ASP.NET Core, sınıflar ve bağımlılıklar arasında Inversion of Control (IoC) başarmak için bir yazılım tasarım deseni olan Dependency Injection (DI) destekler.