ASP.NET Core’da oturum ve durum yönetimi
Rick Anderson, Rick Larkinve Angeles La Gerekiyordu
HTTP durum bilgisiz bir protokoldür. Varsayılan olarak HTTP istekleri, kullanıcı değerlerini tutmaz bağımsız iletilerdir. Bu makalede, istekler arasında kullanıcı verilerini korumak için çeşitli yaklaşımlar açıklanmıştır.
Örnek kodu görüntüleme veya indirme ( nasılindir)
Durum yönetimi
Durum, çeşitli yaklaşımlar kullanılarak depolanmış olabilir. Her yaklaşım bu konunun devamlarında açıklanmıştır.
| Depolama yaklaşımı | Depolama mekanizması |
|---|---|
| CookieS | HTTP cookie s. Sunucu tarafı uygulama kodu kullanılarak depolanan verileri içerebilir. |
| Oturum durumu | HTTP cookie ve sunucu tarafı uygulama kodu |
| TempData | HTTP cookie veya oturum durumu |
| Sorgu dizeleri | HTTP sorgu dizeleri |
| Gizli alanlar | HTTP form alanları |
| HttpContext.Items | Sunucu tarafı uygulama kodu |
| Önbellek | Sunucu tarafı uygulama kodu |
CookieS
Cookieverileri istekler arasında depolar. Her cookie istekle birlikte gönderilen s'ler için boyut en düşük düzeyde tutulmalıdır. İdeal olarak, uygulama tarafından depolanan verilerle cookie yalnızca bir tanımlayıcı içinde depolanmış olmalıdır. Çoğu tarayıcı boyutu cookie 4096 bayt ile kısıtlar. Her etki alanı için cookie yalnızca sınırlı sayıda kullanılabilir.
cookie'ler üzerinde oynandığı için uygulama tarafından doğrulanması gerekir. Cookiekullanıcılar tarafından silinebilir ve istemcilerin süresi dolabilirsiniz. Ancak , cookie genellikle istemcide en dayanıklı veri kalıcılığı biçimidir.
Cookie, genellikle içeriğin bilinen bir kullanıcı için özelleştirdiği kişiselleştirme için kullanılır. Kullanıcı yalnızca tanımlanır ve çoğu durumda kimliği doğrulanmaz. cookie, kullanıcının adını, hesap adını veya GUID gibi benzersiz kullanıcı kimliğini depolar. cookie, kullanıcının tercih ettiği web sitesi arka plan rengi gibi kişiselleştirilmiş ayarlarına erişmek için kullanılabilir.
Avrupa Birliği Genel Veri Koruma Yönetmeliği 'ne (GDPR) bakın ve cookie gizlilikle ilgili endişeleri dikkate atayabilirsiniz. Daha fazla bilgi için bkz. Genel Veri Koruma Yönetmeliği 'de (GDPR) ASP.NET Core.
Oturum durumu
Oturum durumu, ASP.NET Core bir web uygulamasına göz atarak kullanıcı verilerini depolamaya uygun bir senaryodur. Oturum durumu, bir istemciden gelen istekler arasında verileri kalıcı yapmak için uygulama tarafından bakımı yapılan bir depo kullanır. Oturum verileri bir önbellek tarafından destek alınır ve kısa ömürlü veriler olarak kabul edilir. Site, oturum verileri olmadan çalışmaya devam edecektir. Kritik uygulama verileri kullanıcı veritabanında depolanmış ve yalnızca performans iyileştirmesi olarak oturumda önbelleğe alınmış olmalıdır.
Hub, HTTP bağlamından SignalR bağımsız SignalR olarak yürütülene kadar uygulamalarda oturum desteklenmiyor. Örneğin, uzun bir yoklama isteği, isteğin HTTP bağlamının yaşam süresi ötesinde bir hub tarafından açık tutularak oluşabilir.
ASP.NET Core, oturum kimliğini içeren istemciye bir cookie sağlayarak oturum durumunu sürdürür. Oturum cookie kimliği:
- Her istekle birlikte uygulamaya gönderilir.
- Uygulama tarafından oturum verilerini getirmek için kullanılır.
Oturum durumu aşağıdaki davranışları sergiler:
- Oturum, cookie tarayıcıya özeldir. Oturumlar tarayıcılar arasında paylaşılmaz.
- Tarayıcı cookie oturumu sona erdiğinde oturumlar silinir.
- Süresi cookie dolmuş bir oturum için bir alındı ise, aynı oturumu kullanan yeni bir oturum cookie oluşturulur.
- Boş oturumlar korunur. Oturumu istekler arasında kalıcı yapmak için oturumun en az bir değeri ayarlanmış olması gerekir. Bir oturum tutulmasa, her yeni istek için yeni bir oturum kimliği oluşturulur.
- Uygulama, son istekten sonra bir oturumu sınırlı bir süre için korur. Uygulama oturum zaman aşımını ayarlar veya varsayılan 20 dakika değerini kullanır. Oturum durumu, kullanıcı verilerini depolamak için idealdir:
- Bu, belirli bir oturuma özeldir.
- Verilerin oturumlar arasında kalıcı depolama gerektirmesi.
- Oturum verileri, uygulama ISession.Clear çağrıldığunda veya oturumun süresi dolduğunda silinir.
- Uygulama koduna istemci tarayıcısının kapatılmıştır veya oturum silindiğinde ya da istemcide süresi dolduğunda bildirecek cookie varsayılan bir mekanizma yoktur.
- Oturum durumu cookie varsayılan olarak temel olarak işaretlenir. Site ziyaretçisi izlemeye izin verilmediği sürece oturum durumu işlevsel değildir. Daha fazla bilgi için bkz. Genel Veri Koruma Yönetmeliği 'de Genel Veri Koruma Yönetmeliği (GDPR) desteği ASP.NET Core.
Uyarı
Hassas verileri oturum durumuna göre depolamayın. Kullanıcı tarayıcıyı kapatıp oturumunu cookie temizlemeyebilirsiniz. Bazı tarayıcılar tarayıcı cookie pencereleri arasında geçerli oturumları sürdürür. Oturum tek bir kullanıcıyla kısıtlanmamış olabilir. Sonraki kullanıcı aynı oturumla uygulamaya göz cookie atabilir.
Bellek içinde önbellek sağlayıcısı, oturum verilerini uygulamanın bulunduğu sunucunun belleğinde depolar. Sunucu grubu senaryosunda:
- Her oturumu ayrı bir sunucu üzerinde belirli bir uygulama örneğine bağlamak için yapışkan oturumlar kullanın. Azure App Service, yapışkan oturumları varsayılan olarak zorlamak için Uygulama İsteği Yönlendirme (ARR) kullanır. Ancak, yapışkan oturumlar ölçeklenebilirliği etkileyebilir ve web uygulaması güncelleştirmelerini karmaşık hale etkileyebilir. Daha iyi bir yaklaşım, yapışkan oturumlar gerektirmeyen SQL Server redis veya dağıtılmış önbellek kullanmaktır. Daha fazla bilgi için bkz. ASP.NET Core 'de dağıtılmış önbelleğe alma.
- Oturum cookie aracılığıyla IDataProtector şifrelenir. Veri Koruması'nın her makinede oturumları okumak cookie için düzgün yapılandırılması gerekir. Daha fazla bilgi için ASP.NET Core Veri koruma bkz. ve Anahtar depolama sağlayıcıları.
Oturum durumunu yapılandırma
Microsoft.AspNetCore.Session paketi:
- Çerçeve tarafından örtülü olarak dahil edilir.
- Oturum durumunu yönetmek için ara yazılım sağlar.
Oturum ara yazılımlarını etkinleştirmek için Startup şunları içermesi gerekir:
- Bellek IDistributedCache önbelleklerinin herhangi biri. Uygulama,
IDistributedCacheoturum için bir destek deposu olarak kullanılır. Daha fazla bilgi için bkz. ASP.NET Core 'de dağıtılmış önbelleğe alma. - içinde AddSession
ConfigureServicesçağrısı. - içinde UseSession
Configureçağrısı.
Aşağıdaki kodda, bellek içinde oturum sağlayıcısının varsayılan bellek içinde uygulamasıyla nasıl ayarlanları IDistributedCache gösterir:
public class Startup
{
public Startup(IConfiguration configuration)
{
Configuration = configuration;
}
public IConfiguration Configuration { get; }
public void ConfigureServices(IServiceCollection services)
{
services.AddDistributedMemoryCache();
services.AddSession(options =>
{
options.IdleTimeout = TimeSpan.FromSeconds(10);
options.Cookie.HttpOnly = true;
options.Cookie.IsEssential = true;
});
services.AddControllersWithViews();
services.AddRazorPages();
}
public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{
if (env.IsDevelopment())
{
app.UseDeveloperExceptionPage();
}
else
{
app.UseExceptionHandler("/Home/Error");
app.UseHsts();
}
app.UseHttpsRedirection();
app.UseStaticFiles();
app.UseRouting();
app.UseAuthentication();
app.UseAuthorization();
app.UseSession();
app.UseEndpoints(endpoints =>
{
endpoints.MapDefaultControllerRoute();
endpoints.MapRazorPages();
});
}
}
Yukarıdaki kod, testi basitleştirmek için kısa bir zaman aşımı ayarlar.
Ara yazılım sırası önemlidir. UseSessionSonra UseRouting ve önce çağırın UseEndpoints . Bkz. Ara yazılım sıralaması.
HttpContext. Session , oturum durumu yapılandırıldıktan sonra kullanılabilir.
HttpContext.Session çağrılmadan önce erişilemez UseSession .
Uygulama yanıt akışına yazmaya başladıktan sonra yeni bir oturum ile yeni bir oturum cookie oluşturulamaz. Özel durum Web sunucusu günlüğüne kaydedilir ve tarayıcıda gösterilmez.
Oturum durumunu zaman uyumsuz olarak yükle
ASP.NET Core varsayılan oturum sağlayıcısı, oturum kayıtlarını, IDistributedCache yalnızca ISession.LoadAsync yöntem, TryGetValue Set veya metotlardan önce açıkça çağrılırsa, temel alınan yedekleme deposundan zaman uyumsuz olarak yükler Remove . LoadAsyncİlk çağrılmadıysa, temel alınan oturum kaydı zaman uyumlu olarak yüklenir ve bu da ölçekte performans cezası oluşturabilir.
Uygulamaların bu kalıbı zorunlu kılmak için, DistributedSessionStore ve DistributedSession uygulamalarını bir özel durum oluşturan sürümlerle sarın LoadAsync ,, veya öncesinde çağrılamaz TryGetValue Set Remove . Sarmalanan sürümleri hizmetler kapsayıcısına kaydedin.
Oturum seçenekleri
Oturum varsayılanlarını geçersiz kılmak için kullanın SessionOptions .
| Seçenek | Açıklama |
|---|---|
| Cookie | Oluşturmak için kullanılan ayarları belirler cookie . Name Varsayılan olarak SessionDefaults.CookieName ( .AspNetCore.Session ). Path Varsayılan olarak SessionDefaults.CookiePath ( / ). SameSite Varsayılan olarak SameSiteMode.Lax ( 1 ). HttpOnly Varsayılan olarak olur true . IsEssential Varsayılan olarak olur false . |
| IdleTimeout | , IdleTimeout Oturumun içeriği terk edilmeden önce ne kadar süreyle boşta kalabileceğini gösterir. Her oturum erişimi zaman aşımını sıfırlar. Bu ayar, yalnızca oturum içeriği için geçerlidir cookie . Varsayılan değer 20 dakikadır. |
| IOTimeout | Mağazadan bir oturumu yüklemesine veya depolama alanına geri kaydetmeye izin verilen en uzun süre. Bu ayar yalnızca zaman uyumsuz işlemlere uygulanabilir. Bu zaman aşımı, kullanılarak devre dışı bırakılabilir InfiniteTimeSpan . Varsayılan değer 1 dakikadır. |
Oturum cookie , tek bir tarayıcıdan gelen istekleri izlemek ve tanımlamak için bir kullanır. Varsayılan olarak, bu olarak cookie adlandırılır .AspNetCore.Session ve bir yolu kullanır / . Varsayılan, cookie bir etki alanı belirtmediği için, sayfada istemci tarafı komut dosyası tarafından kullanılamaz ( HttpOnly Varsayılan olarak ' dir true ).
Oturum varsayılanlarını geçersiz kılmak için cookie şunu kullanın SessionOptions :
public void ConfigureServices(IServiceCollection services)
{
services.AddDistributedMemoryCache();
services.AddSession(options =>
{
options.Cookie.Name = ".AdventureWorks.Session";
options.IdleTimeout = TimeSpan.FromSeconds(10);
options.Cookie.IsEssential = true;
});
services.AddControllersWithViews();
services.AddRazorPages();
}
Uygulama, IdleTimeout bir oturumun, sunucunun önbelleğindeki içeriği terk edilmeden önce ne kadar süreyle boşta kalabileceğini anlamak için özelliğini kullanır. Bu özellik, cookie süre sonundan bağımsızdır. Oturum ara yazılımı üzerinden geçen her istek zaman aşımını sıfırlar.
Oturum durumu kilitli değil. İki istek aynı anda bir oturumun içeriğini değiştirmeyi denerseniz, son istek ilk geçersiz kılar. Sessiontutarlı bir oturum olarak uygulanır, yani tüm içerikler birlikte depolanır. İki istek farklı oturum değerlerini değiştirmek için arama yaparken, son istek ilk tarafından yapılan oturum değişikliklerini geçersiz kılabilir.
Oturum değerlerini ayarlama ve edinme
Oturum durumuna, Razor ile bir Pages PageModel SıNıFıNDAN veya MVC sınıfından erişilir Controller HttpContext.Session . Bu özellik bir ISession uygulamasıdır.
ISessionUygulama, tamsayı ve dize değerlerini ayarlamak ve almak için birkaç uzantı yöntemi sağlar. Uzantı yöntemleri Microsoft.AspNetCore.Http ad alanıdır.
ISession Uzantı yöntemleri:
- Al (ISession, dize)
- Getınt32 (ISession, dize)
- GetString (ISession, dize)
- Setınt32 (ISession, dize, Int32)
- SetString (ISession, dize, dize)
Aşağıdaki örnek, IndexModel.SessionKeyName _Name bir sayfalar sayfasındaki anahtar (örnek uygulamada) için oturum değerini alır Razor :
@page
@using Microsoft.AspNetCore.Http
@model IndexModel
...
Name: @HttpContext.Session.GetString(IndexModel.SessionKeyName)
Aşağıdaki örnek, bir tamsayı ve bir dizenin nasıl ayarlanacağını ve alınacağını gösterir:
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);
Tüm oturum verileri, bellek içi önbellek kullanılırken bile dağıtılmış önbellek senaryosunu etkinleştirmek üzere serileştirilmelidir. Dize ve tamsayı serileştiriciler, öğesinin genişletme yöntemleri tarafından sağlanır ISession . Karmaşık türler JSON gibi başka bir mekanizma kullanılarak Kullanıcı tarafından serileştirilmelidir.
Nesneleri seri hale getirmek için aşağıdaki örnek kodu kullanın:
public static class SessionExtensions
{
public static void Set<T>(this ISession session, string key, T value)
{
session.SetString(key, JsonSerializer.Serialize(value));
}
public static T Get<T>(this ISession session, string key)
{
var value = session.GetString(key);
return value == null ? default : JsonSerializer.Deserialize<T>(value);
}
}
Aşağıdaki örnek, sınıfı ile serileştirilebilir bir nesnenin nasıl ayarlanacağını ve alınacağını gösterir SessionExtensions :
// Requires SessionExtensions from sample download.
if (HttpContext.Session.Get<DateTime>(SessionKeyTime) == default)
{
HttpContext.Session.Set<DateTime>(SessionKeyTime, currentTime);
}
TempData
ASP.NET Core, Razor tempdata veya Controller sayfalarını kullanıma sunar TempData . Bu özellik, verileri başka bir istekte okunana kadar depolar. Saklama (dize) ve Peek (dize) yöntemleri, isteğin sonunda silme yapılmadan verileri incelemek için kullanılabilir. Saklama için sözlükte tüm öğeleri işaretler. TempData eklenir
- Tek bir istek için veri gerektiğinde yeniden yönlendirme için kullanışlıdır.
- Sağlayıcılar tarafından ya
TempDatada cookie oturum durumu kullanılarak uygulanır.
TempData örnekleri
Bir müşteri oluşturan aşağıdaki sayfayı göz önünde bulundurun:
public class CreateModel : PageModel
{
private readonly RazorPagesContactsContext _context;
public CreateModel(RazorPagesContactsContext context)
{
_context = context;
}
public IActionResult OnGet()
{
return Page();
}
[TempData]
public string Message { get; set; }
[BindProperty]
public Customer Customer { get; set; }
public async Task<IActionResult> OnPostAsync()
{
if (!ModelState.IsValid)
{
return Page();
}
_context.Customer.Add(Customer);
await _context.SaveChangesAsync();
Message = $"Customer {Customer.Name} added";
return RedirectToPage("./IndexPeek");
}
}
Aşağıdaki sayfa görüntülenir TempData["Message"] :
@page
@model IndexModel
<h1>Peek Contacts</h1>
@{
if (TempData.Peek("Message") != null)
{
<h3>Message: @TempData.Peek("Message")</h3>
}
}
@*Content removed for brevity.*@
Önceki İşaretlemede, isteğin sonunda, TempData["Message"] kullanıldığı için silinmez Peek . Sayfanın yenilenmesi, içeriğini görüntüler TempData["Message"] .
Aşağıdaki biçimlendirme önceki koda benzerdir, ancak Keep isteğin sonundaki verileri korumak için kullanır:
@page
@model IndexModel
<h1>Contacts Keep</h1>
@{
if (TempData["Message"] != null)
{
<h3>Message: @TempData["Message"]</h3>
}
TempData.Keep("Message");
}
@*Content removed for brevity.*@
Indexpeek ve ındexkeep sayfaları arasında gezinmek silinmez TempData["Message"] .
Aşağıdaki kod görüntülenir TempData["Message"] , ancak isteğin sonunda TempData["Message"] silinir:
@page
@model IndexModel
<h1>Index no Keep or Peek</h1>
@{
if (TempData["Message"] != null)
{
<h3>Message: @TempData["Message"]</h3>
}
}
@*Content removed for brevity.*@
TempData sağlayıcıları
cookie-Tabanlı TempData sağlayıcısı, ' deki TempData ' i depolamak için varsayılan olarak kullanılır cookie .
cookieVeriler, IDataProtector ile kodlanmış, Base64UrlTextEncoder ve ardından öbekli kullanılarak şifrelenir. En büyük cookie boyut, şifreleme ve parçalama nedeniyle 4096 bayttan daha azdır. cookieŞifrelenmiş verilerin sıkıştırılması, suç ve ihlal saldırıları gibi güvenlik sorunlarına yol açacağından veriler sıkıştırılmaz. Tabanlı TempData sağlayıcısı hakkında daha fazla bilgi için cookie bkz CookieTempDataProvider ..
Bir TempData sağlayıcısı seçin
Bir TempData sağlayıcısı seçmek şöyle bazı hususlar içerir:
- Uygulama oturum durumunu zaten kullanıyor mu? Bu durumda, oturum durumu ' nu kullanmak TempData Provider 'ın veri boyutunun ötesinde uygulamaya ek maliyeti yoktur.
- Uygulama, 500 bayta kadar yalnızca görece küçük miktarlarda veri için TempData kullanıyor mu? Bu durumda, cookie TempData sağlayıcısı her bir istek Için TempData içeren küçük bir maliyet ekler. Aksi takdirde, oturum durumu TempData Provider, Geçicimiz veri tüketilene kadar her istekte büyük miktarda veri dönüşü olmaması yararlı olabilir.
- Uygulama, birden çok sunucuda bir sunucu grubunda mi çalışıyor? Bu durumda, cookie veri koruma dışında TempData sağlayıcısını kullanmak için ek yapılandırma gerekmez (bkz ASP.NET Core Veri koruma . ve anahtar depolama sağlayıcıları).
Web tarayıcıları gibi birçok Web istemcisi, her birinin en büyük boyutu cookie ve toplam sayısı için sınırlar uygular cookie . cookieTempData sağlayıcısını kullanırken, uygulamanın Bu sınırlarıaşmadığını doğrulayın. Verilerin toplam boyutunu göz önünde bulundurun. cookieŞifreleme ve öbek oluşturma nedeniyle hesabın boyutu artar.
TempData sağlayıcısını yapılandırma
cookieTabanlı TempData sağlayıcısı varsayılan olarak etkindir.
Oturum tabanlı TempData sağlayıcısını etkinleştirmek için AddSessionStateTempDataProvider genişletme yöntemini kullanın. Yalnızca bir çağrısı AddSessionStateTempDataProvider gereklidir:
public void ConfigureServices(IServiceCollection services)
{
services.AddControllersWithViews()
.AddSessionStateTempDataProvider();
services.AddRazorPages()
.AddSessionStateTempDataProvider();
services.AddSession();
}
public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{
if (env.IsDevelopment())
{
app.UseDeveloperExceptionPage();
}
else
{
app.UseExceptionHandler("/Home/Error");
app.UseHsts();
}
app.UseHttpsRedirection();
app.UseStaticFiles();
app.UseRouting();
app.UseAuthentication();
app.UseAuthorization();
app.UseSession();
app.UseEndpoints(endpoints =>
{
endpoints.MapDefaultControllerRoute();
endpoints.MapRazorPages();
});
}
Sorgu dizeleri
Yeni isteğin sorgu dizesine eklenerek sınırlı miktarda veri, bir istekten diğerine geçirilebilir. Bu durum, gömülü durum ile bağlantıların e-posta veya sosyal ağlar aracılığıyla paylaşılmasını sağlamak için durumu kalıcı bir şekilde yakalamak için yararlıdır. URL sorgu dizeleri ortak olduğundan, gizli veriler için hiçbir şekilde Sorgu dizelerini kullanmayın.
Sorgu dizelerindeki veriler de dahil olmak üzere, istenmeden paylaşıma ek olarak uygulamayı siteler arası Istek forgery (CSRF) saldırılarına açık duruma getirebilir. Korunan oturum durumunun, CSRF saldırılarına karşı korunması gerekir. Daha fazla bilgi için bkz. ASP.NET Core siteler arası Istek sahteciliği (XSRF/CSRF) saldırılarını önle.
Gizli alanlar
Veriler gizli form alanlarına kaydedilebilir ve sonraki istek üzerine geri gönderilebilir. Bu çok sayfalı formlarda yaygındır. İstemci verilerle oynayabilir olabileceğinden, uygulamanın gizli alanlarda depolanan verileri her zaman yeniden doğrulaması gerekir.
HttpContext. Items
HttpContext.ItemsKoleksiyon, tek bir isteği işlerken verileri depolamak için kullanılır. Koleksiyon içeriği bir istek işlendikten sonra atılır. ItemsKoleksiyon genellikle, bir istek sırasında zaman içinde farklı noktalarda çalıştıklarında ve parametreleri geçirmek için doğrudan bir yol olmadığında bileşenlerin veya ara yazılımların iletişim kurmasına izin vermek için kullanılır.
Aşağıdaki örnekte, Ara yazılım koleksiyona ekler isVerified Items :
public void Configure(IApplicationBuilder app, ILogger<Startup> logger)
{
app.UseRouting();
app.Use(async (context, next) =>
{
logger.LogInformation($"Before setting: Verified: {context.Items["isVerified"]}");
context.Items["isVerified"] = true;
await next.Invoke();
});
app.Use(async (context, next) =>
{
logger.LogInformation($"Next: Verified: {context.Items["isVerified"]}");
await next.Invoke();
});
app.UseEndpoints(endpoints =>
{
endpoints.MapGet("/", async context =>
{
await context.Response.WriteAsync($"Verified: {context.Items["isVerified"]}");
});
});
}
Yalnızca tek bir uygulamada kullanılan ara yazılım için sabit string anahtarlar kabul edilebilir. Uygulamalar arasında paylaşılan ara yazılım, anahtar çakışmalarını önlemek için benzersiz nesne anahtarları kullanmalıdır. Aşağıdaki örnek, bir ara yazılım sınıfında tanımlanan benzersiz bir nesne anahtarının nasıl kullanılacağını gösterir:
public class HttpContextItemsMiddleware
{
private readonly RequestDelegate _next;
public static readonly object HttpContextItemsMiddlewareKey = new Object();
public HttpContextItemsMiddleware(RequestDelegate next)
{
_next = next;
}
public async Task Invoke(HttpContext httpContext)
{
httpContext.Items[HttpContextItemsMiddlewareKey] = "K-9";
await _next(httpContext);
}
}
public static class HttpContextItemsMiddlewareExtensions
{
public static IApplicationBuilder
UseHttpContextItemsMiddleware(this IApplicationBuilder app)
{
return app.UseMiddleware<HttpContextItemsMiddleware>();
}
}
Diğer kod, HttpContext.Items Ara yazılım sınıfının açığa çıkarılan anahtarını kullanarak içinde depolanan değere erişebilir:
HttpContext.Items
.TryGetValue(HttpContextItemsMiddleware.HttpContextItemsMiddlewareKey,
out var middlewareSetValue);
SessionInfo_MiddlewareValue =
middlewareSetValue?.ToString() ?? "Middleware value not set!";
Bu yaklaşım ayrıca koddaki anahtar dizelerinin kullanımını ortadan kaldırma avantajına sahiptir.
Önbellek
Önbelleğe Alma, verileri depolamak ve almak için etkili bir yoldur. Uygulama, önbelleğe alınmış öğelerin ömrünü denetleyebilir. Daha fazla bilgi için bkz. ASP.NET Core 'de yanıt önbelleğe alma.
Önbelleğe alınan veriler belirli bir istek, Kullanıcı veya oturumla ilişkili değildir. Diğer Kullanıcı istekleri tarafından alınabilecek kullanıcıya özgü verileri önbelleğe vermeyin.
Uygulama genelinde verileri önbelleğe almak için bkz ASP.NET Core 'de önbellek belleği ..
Sık karşılaşılan hatalar
"' Microsoft. Extensions türü için hizmet çözümlenemiyor. Önbelleğe Alma. ' Microsoft. AspNetCore. Session. DistributedSessionStore ' etkinleştirilmeye çalışılırken dağıtılmış. ıdistributedcache '. "
Bunun nedeni genellikle en az bir uygulamanın yapılandırması başarısız olmuştur
IDistributedCache. Daha fazla bilgi için ASP.NET Core 'de dağıtılmış önbelleğe alma ve ASP.NET Core 'de önbellek belleği bölümlerine bakın.
Oturum ara yazılımı bir oturumu kalıcı hale getiremezse:
- Ara yazılım özel durumu günlüğe kaydeder ve istek normal olarak devam eder.
- Bu, öngörülemeyen davranışa yol açar.
Yedekleme deposu kullanılamıyorsa, oturum ara yazılımı bir oturumu kalıcı hale getiremeyebilir. Örneğin, bir Kullanıcı bir alışveriş sepetini oturum içinde depolar. Kullanıcı sepete bir öğe ekler, ancak kayıt başarısız olur. Uygulama hata hakkında bilgi sahibi değildir, bu nedenle bu, doğru olmayan, kullanıcıya öğenin sepetine eklendiğini bildirir.
Hataları denetlemek için önerilen yaklaşım, await feature.Session.CommitAsync uygulama oturuma yazma tamamlandığında çağrmalıdır. CommitAsync yedekleme deposu kullanılamıyorsa bir özel durum oluşturur. CommitAsyncBaşarısız olursa, uygulama özel durumu işleyebilir. LoadAsync , veri deposu kullanılamadığında aynı koşulların altına atar.
SignalR ve oturum durumu
SignalR uygulamalar, bilgileri depolamak için oturum durumunu kullanmamalıdır. SignalR uygulamalar, hub 'da bağlantı durumu başına depolama yapabilir Context.Items .
Ek kaynaklar
By Rick Anderson, Steve Smith, Diana Lagülve Luke Latham
HTTP durum bilgisiz bir protokoldür. Ek adımlar uygulamadan, HTTP istekleri Kullanıcı değerlerini veya uygulama durumunu içermeyen bağımsız iletilerdir. Bu makalede, istekler arasında kullanıcı verilerini ve uygulama durumunu korumak için çeşitli yaklaşımlar açıklanmaktadır.
Örnek kodu görüntüleme veya indirme (nasıl indirileceği)
Durum yönetimi
Durum, çeşitli yaklaşımlar kullanılarak depolanabilir. Her yaklaşım, bu konunun ilerleyen kısımlarında açıklanmıştır.
| Depolama yaklaşımı | Depolama mekanizması |
|---|---|
| Cookiemalar | HTTP cookie s (sunucu tarafı uygulama kodu kullanılarak depolanan verileri içerebilir) |
| Oturum durumu | HTTP cookie s ve sunucu tarafı uygulama kodu |
| TempData | HTTP cookie s veya oturum durumu |
| Sorgu dizeleri | HTTP sorgu dizeleri |
| Gizli alanlar | HTTP form alanları |
| HttpContext. Items | Sunucu tarafı uygulama kodu |
| Önbellek | Sunucu tarafı uygulama kodu |
| Bağımlılık Ekleme | Sunucu tarafı uygulama kodu |
Cookiemalar
Cookies verileri istekler arasında depolar. cookieS her istek ile gönderildiğinden, boyutu en az bir olmalıdır. İdeal olarak, cookie uygulama tarafından depolanan verilerle birlikte yalnızca bir tanımlayıcı depolanmalıdır. Tarayıcıların çoğu, cookie boyutu 4096 bayt olarak kısıtlar. cookieHer etki alanı için yalnızca sınırlı sayıda s vardır.
cookieS, değişikliklere tabi olduğundan uygulama tarafından doğrulanması gerekir. Cookies, kullanıcılar tarafından silinebilir ve istemciler üzerinde sona erer. Ancak, cookie genel olarak istemcide en dayanıklı veri kalıcılığı biçimidir.
Cookie, içerik bilinen bir kullanıcı için özelleştirildiğinde, genellikle kişiselleştirme için kullanılır. Kullanıcı yalnızca tanımlı ve kimlik doğrulaması değil çoğu durumda. cookieKullanıcının adını, hesap adını veya benzersiz kullanıcı kimliğini (GUID gibi) depolayabilirler. Daha sonra, cookie tercih edilen web sitesi arka plan rengi gibi kullanıcının kişiselleştirilmiş ayarlarına erişmek için kullanabilirsiniz.
, Ve gizlilik sorunları ile ilgilenirken Avrupa Birliği genel veri koruma düzenlemelerine (GDPR) cookie sahip olun. Daha fazla bilgi için ASP.NET Core genel veri koruma yönetmeliği (GDPR) desteğiniinceleyin.
Oturum durumu
oturum durumu, kullanıcı bir web uygulamasına göz atarken kullanıcı verilerinin depolanması için bir ASP.NET Core senaryodur. Oturum durumu, bir istemciden gelen istekler arasında verileri kalıcı hale getirmek için uygulama tarafından tutulan bir depoyu kullanır. Oturum verileri bir önbellek tarafından desteklenir ve kısa ömürlü veriler olarak kabul edilir. Bu, — sitenin oturum verileri olmadan çalışmaya devam etmesi gerekir. Kritik uygulama verileri Kullanıcı veritabanında depolanmalıdır ve oturum yalnızca bir performans iyileştirmesi olarak önbelleğe alınmalıdır.
Not
SignalRBir SignalR hub http bağlamından bağımsız olarak yürütülemediğinden, oturum uygulamalarda desteklenmez. Örneğin, bir uzun yoklama isteği, isteğin HTTP bağlamının ömrü ötesinde bir hub tarafından açık tutulduğunda bu durum oluşabilir.
ASP.NET Core cookie , her istekle birlikte uygulamaya gönderilen oturum kimliği içeren bir istemciye sağlayarak oturum durumunu korur. Uygulama, oturum verilerini getirmek için oturum KIMLIĞINI kullanır.
Oturum durumu aşağıdaki davranışları sergiler:
- Oturum cookie tarayıcıya özel olduğundan, oturumlar tarayıcılar arasında paylaşılmaz.
- cookieTarayıcı oturumu sona erdiğinde oturum öğeleri silinir.
- Bir cookie oturum, tarihi geçen bir oturum için alınmışsa, aynı oturumu kullanan yeni bir oturum oluşturulur cookie .
- Boş oturumlar tutulmadığı — için oturum, oturum istekleri arasında kalıcı hale getirmek için en az bir değere ayarlanmış olmalıdır. Bir oturum tutulmasa, her yeni istek için yeni bir oturum kimliği oluşturulur.
- Uygulama, son istekten sonra bir oturumu sınırlı bir süre için korur. Uygulama oturum zaman aşımını ayarlar veya varsayılan 20 dakika değerini kullanır. Oturum durumu, belirli bir oturuma özgü ancak verilerin oturumlar arasında kalıcı depolama gerektirmeyen kullanıcı verilerini depolamak için idealdir.
- Oturum verileri, uygulama ISession.Clear çağrıldığunda veya oturumun süresi dolduğunda silinir.
- Uygulama koduna istemci tarayıcısının kapatılmıştır veya oturum silindiğinde ya da istemcide süresi dolduğunda bildirecek cookie varsayılan bir mekanizma yoktur.
- MVC ASP.NET Core sayfaları şablonları, Genel Veri Koruma Yönetmeliği Razor (GDPR) desteği içerir. Oturum cookie durumu varsayılan olarak temel olarak işaretlenmez, bu nedenle site ziyaretçisi izleme izni verilmediği sürece oturum durumu işlevsel değildir. Daha fazla bilgi için bkz. Genel Veri Koruma Yönetmeliği 'de Genel Veri Koruma Yönetmeliği (GDPR) desteği ASP.NET Core.
Uyarı
Hassas verileri oturum durumuna göre depolamayın. Kullanıcı tarayıcıyı kapatıp oturumunu cookie temizlemeyebilirsiniz. Bazı tarayıcılar tarayıcı cookie pencereleri arasında geçerli oturumları sürdürür. Oturum tek bir kullanıcıyla kısıtlanmamış olabilir. — Sonraki kullanıcı aynı oturumla uygulamaya göz atabilir. cookie
Bellek içinde önbellek sağlayıcısı, oturum verilerini uygulamanın bulunduğu sunucunun belleğinde depolar. Sunucu grubu senaryosunda:
- Her oturumu tek bir sunucu üzerinde belirli bir uygulama örneğine bağlamak için yapışkan oturumlar kullanın. Azure App Service, yapışkan oturumları varsayılan olarak zorlamak için Uygulama İsteği Yönlendirme (ARR) kullanır. Ancak, yapışkan oturumlar ölçeklenebilirliği etkileyebilir ve web uygulaması güncelleştirmelerini karmaşık hale etkileyebilir. Daha iyi bir yaklaşım, yapışkan oturumlar gerektirmeyen SQL Server redis veya dağıtılmış önbellek kullanmaktır. Daha fazla bilgi için bkz. ASP.NET Core 'de dağıtılmış önbelleğe alma.
- Oturum cookie aracılığıyla IDataProtector şifrelenir. Veri Koruması'nın her makinede oturumları okumak cookie için düzgün yapılandırılması gerekir. Daha fazla bilgi için ASP.NET Core Veri koruma bkz. ve Anahtar depolama sağlayıcıları.
Oturum durumunu yapılandırma
meta paketine dahil edilen Microsoft.AspNetCore.Session Microsoft.AspNetCore.App, oturum durumunu yönetmek için ara yazılım sağlar. Oturum ara yazılımlarını etkinleştirmek için Startup şunları içermesi gerekir:
- Bellek IDistributedCache önbelleklerinin herhangi biri. Uygulama,
IDistributedCacheoturum için bir destek deposu olarak kullanılır. Daha fazla bilgi için bkz. ASP.NET Core 'de dağıtılmış önbelleğe alma. - içinde AddSession
ConfigureServicesçağrısı. - içinde UseSession
Configureçağrısı.
Aşağıdaki kodda, bellek içinde oturum sağlayıcısının varsayılan bellek içinde uygulamasıyla nasıl ayarlanları IDistributedCache gösterir:
public class Startup
{
public void ConfigureServices(IServiceCollection services)
{
services.AddDistributedMemoryCache();
services.AddSession(options =>
{
// Set a short timeout for easy testing.
options.IdleTimeout = TimeSpan.FromSeconds(10);
options.Cookie.HttpOnly = true;
// Make the session cookie essential
options.Cookie.IsEssential = true;
});
services.AddMvc()
.SetCompatibilityVersion(CompatibilityVersion.Version_2_2);
}
public void Configure(IApplicationBuilder app, IHostingEnvironment env)
{
if (env.IsDevelopment())
{
app.UseDeveloperExceptionPage();
}
else
{
app.UseExceptionHandler("/Error");
app.UseHsts();
}
app.UseHttpsRedirection();
app.UseStaticFiles();
app.UseSession();
app.UseHttpContextItemsMiddleware();
app.UseMvc();
}
}
Ara yazılım sırası önemlidir. Yukarıdaki örnekte, sonrasında InvalidOperationException çağrıldığında bir UseSession özel durum UseMvc oluşur. Daha fazla bilgi için bkz. Ara Yazılım Sıralama.
HttpContext.Session oturum durumu yapılandırıldığında kullanılabilir.
HttpContext.Session çağrılmadan önce UseSession erişilemez.
Uygulama yanıt akışına yazmaya cookie başladıktan sonra yeni oturum ile yeni bir oturum oluşturulamıyor. Özel durum web sunucusu günlüğüne kaydedilir ve tarayıcıda görüntülenmez.
Oturum durumunu zaman uyumsuz olarak yükleme
ASP.NET Core'daki varsayılan oturum sağlayıcısı, yalnızca yöntemi , veya yöntemlerinden önce açıkça çağrılması kaydında temel alınan backing deposundan oturum kayıtlarını zaman uyumsuz IDistributedCache ISession.LoadAsync olarak TryGetValue Set Remove yükler. İlk olarak çağrılmazsa, temel alınan oturum kaydı zaman uyumlu olarak yüklenir ve bu da büyük ölçekte LoadAsync bir performans cezası olabilir.
Uygulamaların bu düzeni zorlaması için, ve uygulamalarını yöntemi , veya 'den önce çağrılmasa bir özel durum oluşturur DistributedSessionStore DistributedSession LoadAsync TryGetValue Set sürümleriyle Remove sarman. Sarmalanmış sürümleri hizmetler kapsayıcısına kaydetme.
Oturum seçenekleri
Oturum varsayılanlarını geçersiz kılmak için SessionOptions kullanın.
| Seçenek | Açıklama |
|---|---|
| Cookie | oluşturmak için kullanılan ayarları cookie belirler. Name varsayılan değer SessionDefaults.CookieName : ( .AspNetCore.Session ). Path varsayılan değer SessionDefaults.CookiePath : ( / ). SameSite varsayılan değer SameSiteMode.Lax : ( 1 ). HttpOnly varsayılan olarak true kullanılır. IsEssential varsayılan olarak false kullanılır. |
| IdleTimeout | , IdleTimeout içeriği bırakılmadan önce oturumun ne kadar süreyle boşta bırakıl olduğunu gösterir. Her oturum erişimi zaman aşımını sıfırlar. Bu ayar yalnızca oturumun içeriği için geçerlidir, için geçerli cookie değildir. Varsayılan değer 20 dakikadır. |
| IOTimeout | Oturumu mağazadan yüklemek veya depoya geri işlemek için izin verilen en uzun süre. Bu ayar yalnızca zaman uyumsuz işlemler için geçerli olabilir. Bu zaman aşımı kullanılarak devre dışı InfiniteTimeSpan bırakılabilir. Varsayılan değer 1 dakikadır. |
Oturum, tek cookie bir tarayıcıdan gelen istekleri izlemek ve tanımlamak için bir kullanır. Varsayılan olarak cookie bu, olarak .AspNetCore.Session adlandırılmıştır ve yolunu / kullanır. Varsayılan değer bir etki alanı belirtmeytiği için, sayfada istemci tarafı betiği için kullanılabilir değildir (varsayılan olarak değeri cookie HttpOnly true olduğundan).
Oturum cookie varsayılanlarını geçersiz kılmak için SessionOptions kullanın:
public void ConfigureServices(IServiceCollection services)
{
services.Configure<CookiePolicyOptions>(options =>
{
options.CheckConsentNeeded = context => true;
options.MinimumSameSitePolicy = SameSiteMode.None;
});
services.AddDistributedMemoryCache();
services.AddMvc()
.SetCompatibilityVersion(CompatibilityVersion.Version_2_2);
services.AddSession(options =>
{
options.Cookie.Name = ".AdventureWorks.Session";
options.IdleTimeout = TimeSpan.FromSeconds(10);
options.Cookie.IsEssential = true;
});
}
Uygulama, bir oturumun sunucu önbelleğinde içeriği bırakılmadan önce ne kadar süreyle IdleTimeout boşta bırakıla olacağını belirlemek için özelliğini kullanır. Bu özellik süre sonu cookie bağımsızdır. Oturum Ara Yazılımı'nın üzerinden geçen her istek zaman aşımını sıfırlar.
Oturum durumu kilitlenmez. İki istek aynı anda bir oturumun içeriğini değiştirmeyi denerse, son istek ilk isteği geçersiz kılar. Session tutarlı bir oturum olarak uygulanır, yani tüm içerikler birlikte depolanır. İki istek farklı oturum değerlerini değiştirmeye çalıştıklarında, son istek ilk istek tarafından yapılan oturum değişikliklerini geçersiz kabilirsiniz.
Oturum değerlerini ayarlama ve al
Oturum durumuna bir Razor Pages sınıfından PageModel veya ile MVC Controller sınıfından HttpContext.Session erişilir. Bu özellik bir ISession uygulamadır.
Uygulama, ISession tamsayı ve dize değerlerini ayarlamak ve almak için çeşitli uzantı yöntemleri sağlar. Proje tarafından Microsoft.AspNetCore.Http using Microsoft.AspNetCore.Http; Microsoft.AspNetCore.Http.Extensions paketine başvurularak uzantı yöntemleri ad alanı içindedir (uzantı yöntemlerine erişim elde etmek için bir deyimi ekleyin). Her iki paket de meta Microsoft.AspNetCore.App dahil edilir.
ISession uzantı yöntemleri:
- Get(ISession, String)
- GetInt32(ISession, String)
- GetString(ISession, String)
- SetInt32(ISession, String, Int32)
- SetString(ISession, String, String)
Aşağıdaki örnek, Sayfalar sayfasında anahtarın oturum değerini IndexModel.SessionKeyName _Name (örnek uygulamada) Razor almaktadır:
@page
@using Microsoft.AspNetCore.Http
@model IndexModel
...
Name: @HttpContext.Session.GetString(IndexModel.SessionKeyName)
Aşağıdaki örnek, bir tamsayı ve dize ayarlamayı ve bu dizeyi nasıl alalır?
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);
Bellek içinde önbellek kullanılırken bile dağıtılmış önbellek senaryosunu etkinleştirmek için tüm oturum verileri seri hale getirilecek. Dize ve tamsayı seri hale getiricileri uzantısı yöntemleri tarafından ISession sağlanır. Karmaşık türler, JSON gibi başka bir mekanizma kullanılarak kullanıcı tarafından seri hale getirilene sahip olması gerekir.
Serileştirilebilir nesneleri ayarlamak ve almak için aşağıdaki uzantı yöntemlerini ekleyin:
public static class SessionExtensions
{
public static void Set<T>(this ISession session, string key, T value)
{
session.SetString(key, JsonConvert.SerializeObject(value));
}
public static T Get<T>(this ISession session, string key)
{
var value = session.GetString(key);
return value == null ? default(T) :
JsonConvert.DeserializeObject<T>(value);
}
}
Aşağıdaki örnek, uzantı yöntemleriyle serileştirilebilir bir nesnenin nasıl ayar ve elde edilebilir olduğunu gösterir:
// Requires you add the Set and Get extension method mentioned in the topic.
if (HttpContext.Session.Get<DateTime>(SessionKeyTime) == default(DateTime))
{
HttpContext.Session.Set<DateTime>(SessionKeyTime, currentTime);
}
TempData
ASP.NET Core, Razor Pages TempData veya Controller öğesini TempData gösterir. Bu özellik, başka bir istekte okunana kadar verileri depolar. Keep(String) ve Peek(string) yöntemleri, isteğin sonunda silinmeden verileri incelemek için kullanılabilir. Keep() sözlükte saklama için tüm öğeleri işaretler. TempData , tek bir istekten daha fazla veri gerektiğinde yeniden yönlendirme için özellikle yararlıdır. TempData sağlayıcılar tarafından TempData veya oturum durumu kullanılarak cookie uygulanır.
TempData örnekleri
Müşteri oluşturan aşağıdaki sayfayı göz önünde bulun:
public class CreateModel : PageModel
{
private readonly RazorPagesContactsContext _context;
public CreateModel(RazorPagesContactsContext context)
{
_context = context;
}
public IActionResult OnGet()
{
return Page();
}
[TempData]
public string Message { get; set; }
[BindProperty]
public Customer Customer { get; set; }
public async Task<IActionResult> OnPostAsync()
{
if (!ModelState.IsValid)
{
return Page();
}
_context.Customer.Add(Customer);
await _context.SaveChangesAsync();
Message = $"Customer {Customer.Name} added";
return RedirectToPage("./IndexPeek");
}
}
Aşağıdaki sayfada TempData["Message"] görüntülenir:
@page
@model IndexModel
<h1>Peek Contacts</h1>
@{
if (TempData.Peek("Message") != null)
{
<h3>Message: @TempData.Peek("Message")</h3>
}
}
@*Content removed for brevity.*@
Yukarıdaki işaretlemede, isteğin sonunda kullanılmış olduğundan TempData["Message"] Peek silinmez. Sayfayı yenilerken TempData["Message"] görüntülenir.
Aşağıdaki işaretleme önceki koda benzer, ancak Keep isteğin sonundaki verileri korumak için kullanır:
@page
@model IndexModel
<h1>Contacts Keep</h1>
@{
if (TempData["Message"] != null)
{
<h3>Message: @TempData["Message"]</h3>
}
TempData.Keep("Message");
}
@*Content removed for brevity.*@
IndexPeek ve IndexKeep sayfaları arasında gezinmek TempData["Message"] silemez.
Aşağıdaki kodda TempData["Message"] görüntülenir, ancak isteğin sonunda TempData["Message"] silinir:
@page
@model IndexModel
<h1>Index no Keep or Peek</h1>
@{
if (TempData["Message"] != null)
{
<h3>Message: @TempData["Message"]</h3>
}
}
@*Content removed for brevity.*@
TempData sağlayıcıları
-based cookie TempData sağlayıcısı varsayılan olarak TempData'nın içinde depolar. cookie
Veriler cookie kullanılarak IDataProtector şifrelenir, ile kodlanmış ve ardından Base64UrlTextEncoder öbeklenir. cookieöbekli olduğundan, cookie 1.x ASP.NET Core tek boyut sınırı geçerli değildir. Şifrelenmiş verilerin sıkıştırılırken CRIME ve BREACH saldırıları gibi güvenlik sorunlarına neden olduğu cookie için veriler sıkıştırılır. Tabanlı TempData sağlayıcısı cookie hakkında daha fazla bilgi için bkz. CookieTempDataProvider .
TempData sağlayıcısı seçme
TempData sağlayıcısı seçme, aşağıdakiler gibi bazı önemli noktalar içerir:
- Uygulama zaten oturum durumunu kullanıyor mu? Bu durumda, TempData sağlayıcısının oturum durumunun kullanımı uygulamaya ek bir ücret ödemez (verilerin boyutu dışında).
- Uygulama görece az miktarda veri (en fazla 500 bayt) için TempData kullanıyor mu? Öyleyse, cookie TempData sağlayıcısı TempData'nın taşıdığı her ikaz için küçük bir maliyet ekler. Yoksa, TempData sağlayıcısı tempdata tüketilene kadar her istekte büyük miktarda verinin yuvarlanmasından kaçınmak için TempData sağlayıcısı yararlı olabilir.
- Uygulama birden çok sunucu üzerinde bir sunucu grubu içinde mi çalıştır? Öyleyse, Veri Koruma dışında TempData sağlayıcısını kullanmak için ek yapılandırma gerekmez cookie (bkz. ASP.NET Core Veri koruma ve Anahtar depolama sağlayıcıları).
Not
Çoğu web istemcisinde (web tarayıcıları gibi) her biri için maksimum boyuta, toplam s sayısına veya her ikisine de cookie cookie sınırlar uygulanır. cookieTempData sağlayıcısını kullanırken, uygulamanın bu sınırları geçmeyeceklerini doğrulayın. Verilerin toplam boyutunu göz önünde bulundurabilirsiniz. Şifreleme ve öbek cookie nedeniyle boyut artışlarını hesaba.
TempData sağlayıcısını yapılandırma
-based cookie TempData sağlayıcısı varsayılan olarak etkindir.
Oturum tabanlı TempData sağlayıcısını etkinleştirmek için uzantı AddSessionStateTempDataProvider yöntemini kullanın:
public void ConfigureServices(IServiceCollection services)
{
services.Configure<CookiePolicyOptions>(options =>
{
options.CheckConsentNeeded = context => true;
options.MinimumSameSitePolicy = SameSiteMode.None;
});
services.AddMvc()
.SetCompatibilityVersion(CompatibilityVersion.Version_2_2)
.AddSessionStateTempDataProvider();
services.AddSession();
}
public void Configure(IApplicationBuilder app, IHostingEnvironment env)
{
if (env.IsDevelopment())
{
app.UseDeveloperExceptionPage();
app.UseDatabaseErrorPage();
}
else
{
app.UseExceptionHandler("/Error");
app.UseHsts();
}
app.UseHttpsRedirection();
app.UseStaticFiles();
app.UseCookiePolicy();
app.UseSession();
app.UseMvc();
}
Ara yazılım sırası önemlidir. Yukarıdaki örnekte, sonrasında InvalidOperationException çağrıldığında bir UseSession özel durum UseMvc oluşur. Daha fazla bilgi için bkz. Ara Yazılım Sıralama.
Önemli
Hedef .NET Framework oturum tabanlı TempData sağlayıcısını kullanıyorsanız, projeye Microsoft.AspNetCore.Session paketini ekleyin.
Sorgu dizeleri
Yeni isteğin sorgu dizesine ek olarak bir istekten diğerine sınırlı miktarda veri geçirebilirsiniz. Bu, ekli durumla bağlantıların e-posta veya sosyal ağlar üzerinden paylaşılmalarına olanak sağlayan kalıcı bir şekilde durumu yakalamak için kullanışlıdır. URL sorgu dizeleri genel olduğundan, hiçbir zaman hassas veriler için sorgu dizeleri kullanma.
Sorgu dizeleri içinde veriler dahil olmak üzere, isteksiz paylaşıma ek olarak Siteler Arası İstek Sahtecilığı (CSRF) saldırıları için fırsatlar oluşturabilir ve bu da kullanıcıları kimlik doğrulaması sırasında kötü amaçlı siteleri ziyaret etmek için kandırabilirsiniz. Saldırganlar daha sonra uygulamadan kullanıcı verilerini çalar veya kullanıcı adına kötü amaçlı eylemler gerçekleştirebilirsiniz. Korunan tüm uygulama veya oturum durumlarının CSRF saldırılarına karşı korunması gerekir. Daha fazla bilgi için bkz. ASP.NET Core siteler arası Istek sahteciliği (XSRF/CSRF) saldırılarını önle.
Gizli alanlar
Veriler gizli form alanlarına kaydedilebilir ve sonraki istekte geri yayın edilebilir. Bu, çok sayfalı formlarda yaygındır. İstemci verilerle oynayabilecek olduğundan, uygulamanın gizli alanlarda depolanan verileri her zaman yeniden doğrulası gerekir.
HttpContext.Items
Koleksiyon, HttpContext.Items tek bir isteği işlerken verileri depolamak için kullanılır. Bir istek işlendikten sonra koleksiyonun içerikleri atılır. Koleksiyon genellikle bir istek sırasında farklı noktalarda çalışan ve parametreleri doğrudan iletecek bir yolu olmadan bileşenlerin veya ara yazılımların iletişim kurmasına Items izin vermek için kullanılır.
Aşağıdaki örnekte ara yazılım isVerified koleksiyonuna Items ekler.
app.Use(async (context, next) =>
{
// perform some verification
context.Items["isVerified"] = true;
await next.Invoke();
});
İşlem hattının devamlarında, başka bir ara yazılım değerine isVerified erişebilirsiniz:
app.Run(async (context) =>
{
await context.Response.WriteAsync($"Verified: {context.Items["isVerified"]}");
});
Yalnızca tek bir uygulama tarafından kullanılan ara yazılım için anahtarlar string kabul edilebilir. Uygulama örnekleri arasında paylaşılan ara yazılım, anahtar çakışmalarını önlemek için benzersiz nesne anahtarları kullanılmalıdır. Aşağıdaki örnek, bir ara yazılım sınıfında tanımlanan benzersiz bir nesne anahtarının nasıl kullanılageldi:
public class HttpContextItemsMiddleware
{
private readonly RequestDelegate _next;
public static readonly object HttpContextItemsMiddlewareKey = new Object();
public HttpContextItemsMiddleware(RequestDelegate next)
{
_next = next;
}
public async Task Invoke(HttpContext httpContext)
{
httpContext.Items[HttpContextItemsMiddlewareKey] = "K-9";
await _next(httpContext);
}
}
public static class HttpContextItemsMiddlewareExtensions
{
public static IApplicationBuilder
UseHttpContextItemsMiddleware(this IApplicationBuilder builder)
{
return builder.UseMiddleware<HttpContextItemsMiddleware>();
}
}
Diğer kod, ara yazılım sınıfı HttpContext.Items tarafından ortaya çıkaran anahtarı kullanarak içinde depolanan değere erişebilirsiniz:
HttpContext.Items
.TryGetValue(HttpContextItemsMiddleware.HttpContextItemsMiddlewareKey,
out var middlewareSetValue);
SessionInfo_MiddlewareValue =
middlewareSetValue?.ToString() ?? "Middleware value not set!";
Bu yaklaşım ayrıca kodda anahtar dizelerinin kullanımını ortadan kaldırma avantajına da sahip olur.
Önbellek
Önbelleğe Alma verileri depolamak ve almak için verimli bir yol sağlar. Uygulama, önbelleğe alınan öğelerin ömrünü kontrol eder.
Önbelleğe alınan veriler belirli bir istek, kullanıcı veya oturumla ilişkili değildir. Diğer kullanıcıların istekleri tarafından alınarak alınan kullanıcıya özgü verileri önbelleğe almama konusunda dikkatli olun.
Daha fazla bilgi için bkz. ASP.NET Core 'de yanıt önbelleğe alma.
Bağımlılık Ekleme
Verileri tüm kullanıcılar için kullanılabilir hale yapmak için Bağımlılık Ekleme'ye kullanın:
Verileri içeren bir hizmet tanımlayın. Örneğin, adlı bir sınıf
MyAppDatatanımlanır:public class MyAppData { // Declare properties and methods }hizmet sınıfını 'a
Startup.ConfigureServicesekleyin:public void ConfigureServices(IServiceCollection services) { services.AddSingleton<MyAppData>(); }Veri hizmeti sınıfını kullanın:
public class IndexModel : PageModel { public IndexModel(MyAppData myService) { // Do something with the service // Examples: Read data, store in a field or property } }
Sık karşılaşılan hatalar
"'Microsoft.Extensions türü için hizmet çözümlenemiyor. Önbelleğe Alma. 'Microsoft.AspNetCore.Session.DistributedSessionStore' etkinleştirmeye çalışırken Distributed.IDistributedCache'.
Bu durum genellikle en az bir uygulama yapılandırılamayarak
IDistributedCachekaynak olur. Daha fazla bilgi için ASP.NET Core 'de dağıtılmış önbelleğe alma ve ASP.NET Core 'de önbellek belleği bölümlerine bakın.Oturum ara yazılımı bir oturumu kalıcı olarak sürdüremezse (örneğin, destek deposu kullanılamıyorsa), ara yazılım özel durumu günlüğe kaydeder ve istek normal şekilde devam eder. Bu, tahmin edilemeyen davranışlara yol açıyor.
Örneğin, bir kullanıcı oturumda alışveriş sepeti depolar. Kullanıcı sepete bir öğe ekler ancak işleme başarısız olur. Uygulama hatanın ne olduğunu bilmiyor, bu nedenle kullanıcıya öğenin sepetine ekli olduğunu rapor etti ve bu doğru değil.
Hataları denetlemeye önerilen yaklaşım, uygulamanın oturuma yazması
await feature.Session.CommitAsync();bittiğinde uygulama kodundan çağrısı yapmaktır.CommitAsync, arka depo kullanılamıyorsa bir özel durum oluşturur. BaşarısızCommitAsyncolursa, uygulama özel durumu işleyebilirsiniz.LoadAsync, veri deposu kullanılamıyorsa aynı koşullar altında atar.
SignalR ve oturum durumu
SignalR uygulamalar bilgileri depolamak için oturum durumunu kullanmamalı. SignalR uygulamaları, hub'da bağlantı Context.Items durumuna göre depolar.