メインメニューを開く

差分

ASP.NET CoreのセッションをRedisに保存する

772 バイト追加, 2024年3月7日 (木)
編集の要約なし
[[ASP .NET Core]]の[[セッション]]を[[Redis]]に保存したい。
; 前提
* ASP .NET Core 1.1を使用
* Redisサーバーは立ち上がっていること
*: この例では[[QNAP]]上の[[Docker]]で[[Redis]]を立ち上げているのでポート番号が一般的ではない点に注意
; 使用するNuGetパッケージ== 前提 ==* Microsoft.Extensions.Caching.Redis* Microsoft.AspNetCore.SessionどちらのパッケージもASP ASP.NET Core 28.0版が最新なので、[[NuGet]]から入れるときにバージョン指定で10.x系を入れている。1
== nuget ==[[Redis]]の[[NuGet]]を入れる。* Microsoft.Extensions.Caching.StackExchangeRedis == appsettings.json ==ConnectionStringsにredisの設定を書く。<source lang="json">{ "ConnectionStrings": { "redis": "localhost:6379" }, "Logging": { "LogLevel": { "Default": "Information", "Microsoft.AspNetCore": "Warning" } }, "AllowedHosts": "*"}</source> == serviceとapp ==appsettings.jsonを読み込みredisサービスを追加する。<source lang="csharp">// Redisの設定builder.Services.AddStackExchangeRedisCache(options =>{ options.Configuration = builder.Configuration.GetConnectionString("redis"); Startup options.csでサービス追加をして使用宣言をする。InstanceName = "";});</source> セッションの設定をする。
<source lang="csharp">
public void ConfigureServices// セッションの設定builder.Services.AddSession(options =>{ options.IdleTimeout = TimeSpan.FromMinutes(IServiceCollection services60); // セッションのタイムアウト時間 { options.Cookie.Name = "session"; // セッション用のクッキー名 // Add framework servicesoptions.Cookie.IsEssential = true;});</source>
// Redis Session services.AddDistributedRedisCache(options =>セッションを有効化する。 { options.Configuration <source lang= "192.168.10.20:32776csharp";> optionsapp.InstanceName = ""UseSession(); });</source>
services.AddSession(options => { options.CookieName = "session";= セッションの暗号化 === optionsasp.IdleTimeout = TimeSpan.FromMinutes(60); });net coreではセッションデータ(や一時データなどはすべて)は問答無用で暗号化されます。デバッグ時であろうと無効化はできないっぽいです。その関係で初期状態のままでは複数のサーバー(異なるアプリ)でデータ共有することができません。このままではバックエンドに[[redis]]を使っている意味ないです。はい。
services.AddMvc();暗号化の設定は2パターンあるようです。 }* アプリ名を統一する* 共通のキーを使う
public void Configure複数のウェブサーバーのセッションを共有するだけならアプリ名の統一が簡単です。<source lang="csharp">using Microsoft.AspNetCore.DataProtection;// 中略builder.Services.AddDataProtection(IApplicationBuilder app, IHostingEnvironment env, ILoggerFactory loggerFactory) { app.UseSessionSetApplicationName("appName"); }
</source>
 
おわり。