ASP.NET web uygulamasında oturum durumu bilgilerini depolama

Tamamlandı

Web uygulamalarının kullandığı HTTP protokolünün yapısı gereği durum bilgisi olmaz. Birçok web uygulamasının bu isteklere bağlam sağlamak için istekler arasında durum bilgilerini koruması gerekir. Bu bağlam, oturum olarak adlandırılır. Bir oturumun durum bilgilerini birçok şekilde kaydedebilirsiniz, ancak bazı yöntemler diğerlerinden daha uygundur. Neyin uygun olduğu, web uygulamasının çalıştığı ortama bağlıdır.

Oturum durumunu depolama seçenekleri

Oturumlara bağlı olan bir ASP.NET web uygulamasında uygun bir oturum durumu sağlayıcısı kullanmak önemlidir. Oturum durumu sağlayıcısı, her kullanıcı oturumu için durumu kalıcı hale gelip korumakla sorumludur. Bir web uygulamasının yüz binlerce eşzamanlı kullanıcıyı desteklemesi amaçlanıyorsa, oturum durumu sağlayıcısının her kullanıcı için ayrı, özel oturumları desteklemesi gerekir.

Normalde oturum bilgilerini web sunucusu yönetir. Oturum verileri genellikle yalnızca bir anahtar/değer çifti koleksiyonudur. Her oturumun benzersiz bir tanımlayıcısı vardır.

İstemci bir web uygulamasına bağlanıp yeni bir oturum başlattığında, sunucu bir oturum tanımlayıcısı oluşturur ve HTTP yanıt iletisinin bir parçası olarak istemciye geri geçirir. Bu tanımlayıcı genellikle istemcinin web tarayıcısının veya istemci uygulamasının kaydedebileceği bir tanımlama bilgisi biçiminde döndürülür. Sonraki tüm istekler bu tanımlama bilgisini isteğin bir parçası olarak içerebilir, böylece web uygulaması her isteğin hangi oturuma ait olduğunu bilir.

Diagram showing the relationships between client apps, the web app running on the web server, and session state information identified by using cookies.

Web sunucusunda oturum verileri bellekte, disk dosyasında, Azure Tablo depolaması gibi paylaşılan bir konumda veya bir tür veritabanında depolanabilir.

Oturum verilerinin bellekte tutulması hızlı erişim sağlar ancak yatay ölçeklenebilirliği etkiler. Web uygulaması bir web grubu olarak veya çok bölgeli dağıtımın parçası olarak davranan birden çok sunucu tarafından barındırılıyorsa, istemciden gelen ve belirli bir tanımlama bilgisini belirten tüm isteklerin aynı sunucuya yönlendirilmesi gerekir. Bu da kalıcı oturumlarla sonuçlanır.

Bu düzeyde bir istemci/sunucu benzeşimi, bazı sunucular aşırı yüklenirken diğerlerinin daha az yük almasına yol açabilir. Ayrıca, sunucu başarısız olursa durum bilgileri kaybolur.

Oturum verilerinin bir dosyaya kaydedilmesi oturum verilerinin kaybolma olasılığını azaltır, ancak dosya bir sunucunun yerel dosya sisteminde depolanıyorsa benzer sorunlarla karşılaşabilir. İstemci/sunucu benzeşimi sorun olmaya devam eder. Web sunucusu başarısız olursa, sunucu kurtarılana kadar oturum durumu bilgileri kullanılamaz.

En ölçeklenebilir yaklaşım, oturum verilerini tüm sunucuların erişebildiği paylaşılan bir veri deposuna yazmaktır. Bu yaklaşım, sunucular arasında istek yükünün dengelemesini geliştirmekle kalmaz, tek web sunucusu başarısız olduğunda da oturum durumunun kullanılabilirliğini güvence altına da alır.

Azure kullanıyorsanız Tablo depolaması, Azure SQL Veritabanı veya Redis için Azure Cache gibi bir hizmet kullanabilirsiniz. Redis, anahtar/değer çiftlerini depolamak için tasarlanmış ve son derece iyileştirilmiş bir önbellek hizmetidir. Bu seçenekler arasında oturumları bellekte depolamaya en yakın performansı sağlayan Redis için Azure Cache hizmetidir.

ASP.NET web uygulamasında oturum durumu sağlayıcısı yapılandırma

Oturum durumu sağlayıcısı, ASP.NET bir web uygulamasında oturum durumunu yönetir. Oturum durumu sağlayıcısı her istemci için oturum verilerini düzenler, oturum verilerinin yaşam süresini işler (bir oturumun süresi dolduğunda kaldırılmasını sağlar) ve gizliliği korur. Oturum verileri genellikle şifrelenir ve farklı kullanıcılar arasında paylaşılmamalıdır.

ASP.NET bir web uygulamasında, web.config dosyasının <sessionState> bölümünü kullanarak bir oturum durumu sağlayıcısı yapılandırabilirsiniz. <sessionState> etiketi oturum sağlayıcısını belirtir. Her sağlayıcı, sağlayıcıya özgü ayarları içeren kendi <sağlayıcılar> bölümünde yapılandırılır.

ASP.NET için varsayılan oturum durumu sağlayıcısı bellekte çalışır ve ayrı bir sağlayıcı gerektirmez. Yapılandırma aşağıdakine benzer:

<configuration>
  ...
  <system.web>
    ...
    <sessionState mode="InProc" />
    ...
  </system.web>
  ...
</configuration>

Farklı bir sağlayıcı kullanmak için sessionState> öğesinde <modu Özel olarak ayarlayın ve sağlayıcıyı içeren NuGet paketini web uygulamanıza ekleyin. Ardından, web.config dosyasının <sessionState> bölümünü sağlayıcıya başvurmak ve sağlayıcı ayarlarını yapılandırmak için değiştirin.

Aşağıdaki örnekte, Azure Cosmos DB oturum durumu sağlayıcısının yapılandırması gösterilmektedir. Bu sağlayıcı oturum verilerini Cosmos DB veritabanındaki bir kapsayıcıya yazar. Veritabanını ve koleksiyonu belirtmek için databaseId ve collectionId parametrelerini kullanırsınız.

<sessionState mode="Custom" customProvider="CosmosDBSessionStateProviderAsync">
  <providers>
    <add name="CosmosDBSessionStateProviderAsync" 
         cosmosDBEndPointSettingKey="[cosmosDBEndPointSetting]" 
         cosmosDBAuthKeySettingKey="[cosmosDBAuthKeySetting]" 
         databaseId="[DataBaseId]" 
         collectionId="[CollectionId]" 
         offerThroughput="5000" 
         connectionMode="Direct" 
         connectionProtocol="Tcp" 
         requestTimeout="5" 
         maxConnectionLimit="50" 
         maxRetryAttemptsOnThrottledRequests="10" 
         maxRetryWaitTimeInSeconds="10" 
         preferredLocations="" 
         partitionKey="" 
         partitionNumUsedByProvider="" 
         type="Microsoft.AspNet.SessionState.CosmosDBSessionStateProviderAsync, Microsoft.AspNet.SessionState.CosmosDBSessionStateProviderAsync, Version=1.1.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" />
  </providers>
</sessionState>

Önceden oluşturulmuş bir Cosmos DB hesabınız olmalıdır. Uç noktanın adresini ve kimlik doğrulama anahtarını cosmosDBEndPointSettingKey ve cosmosDBAuthKeySettingKey parametrelerinde sağlarsınız.

Aşağıdaki ikinci örnekte, Redis için Azure Cache sağlayıcısının yapılandırması gösterilmektedir. Burada da Redis için Azure Cache örneği zaten mevcut olmalıdır.

<sessionState mode="Custom" customProvider="MySessionStateStore">
  <providers>
    <add name="MySessionStateStore"
         type="Microsoft.Web.Redis.RedisSessionStateProvider"
         host="[AzureCacheFirRedisEndpoint]"
         accessKey="[AccessKey]"
         ssl="true" />
  </providers>
</sessionState>

Önbelleğin Genel Bakış sayfasındaki Konak adı ayarı için kullanılacak uç nokta adresini Azure portalında bulabilirsiniz:

Screenshot showing Azure Cache for Redis page in the Azure portal. The host name for the cache is highlighted.

AccessKey değeri olarak portalın Erişim anahtarları sayfasında listelenen anahtarlardan birini belirtin:

Screenshot showing the Access keys page for the cache in the Azure portal. The access keys are highlighted.

Oturum durumu bilgilerini depolamak için farklı teknolojiler kullanan diğer birçok sağlayıcı Microsoft ve iş ortağı kuruluşlarından edinilebilir.

Not

Oturum durumu sağlayıcısı seçimi, uygulama kodunuz için saydamdır. Oturum durumu sağlayıcılarını değiştirirseniz uygulamanızda herhangi bir değişiklik yapmanız gerekmez.