「ASP.NET CoreのセッションをRedisに保存する」の版間の差分

提供: MonoBook
ナビゲーションに移動 検索に移動
1行目: 1行目:
 
[[ASP .NET Core]]の[[セッション]]を[[Redis]]に保存したい。
 
[[ASP .NET Core]]の[[セッション]]を[[Redis]]に保存したい。
  
; 前提
 
* ASP .NET Core 1.1を使用
 
* Redisサーバーは立ち上がっていること
 
*: この例では[[QNAP]]上の[[Docker]]で[[Redis]]を立ち上げているのでポート番号が一般的ではない点に注意
 
  
; 使用するNuGetパッケージ
+
== 実装 ==
* Microsoft.Extensions.Caching.Redis
+
=== 前提 ===
* Microsoft.AspNetCore.Session
+
* ASP.NET Core 8.0.1
どちらのパッケージもASP .NET Core 2.0版が最新なので、[[NuGet]]から入れるときにバージョン指定で1.x系を入れている。
 
  
; Startup.csでサービス追加をして使用宣言をする。
+
=== 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 ===
 +
 
 +
appsettings.jsonを読み込みredisサービスを追加する。
 +
<source lang="csharp">
 +
// Redisの設定
 +
builder.Services.AddStackExchangeRedisCache(options =>
 +
{
 +
    options.Configuration = builder.Configuration.GetConnectionString("redis");
 +
    options.InstanceName = "";
 +
});
 +
</source>
 +
 
 +
セッションの設定をする。
 +
<source lang="csharp">
 +
// セッションの設定
 +
builder.Services..AddSession(options =>
 +
{
 +
    options.IdleTimeout = TimeSpan.FromMinutes(60); // セッションのタイムアウト時間
 +
    options.Cookie.Name = "session"; // セッション用のクッキー名
 +
    options.Cookie.IsEssential = true;
 +
});
 +
</source>
 +
 
 +
セッションを有効化する。
 
<source lang="csharp">
 
<source lang="csharp">
        public void ConfigureServices(IServiceCollection services)
+
app.UseSession();
        {
+
</source>
            // Add framework services.
 
  
            // Redis Session
+
=== セッションの暗号化 ===
            services.AddDistributedRedisCache(options =>
+
asp.net coreではセッションデータが暗号化されます。
            {
+
その関係で初期状態のままでは複数のサーバー(異なるアプリ)でデータ共有することができません。
                options.Configuration = "192.168.10.20:32776";
 
                options.InstanceName = "";
 
            });
 
  
            services.AddSession(options =>
+
暗号化の設定は2パターンあります。
            {
+
* アプリ名を統一する
                options.CookieName = "session";
+
* 共通のキーを使う
                options.IdleTimeout = TimeSpan.FromMinutes(60);
 
            });
 
  
            services.AddMvc();
+
なお、無効化はできないっぽいです。
        }
 
  
        public void Configure(IApplicationBuilder app, IHostingEnvironment env, ILoggerFactory loggerFactory)
+
複数のウェブサーバーのセッションを共有するだけならアプリ名の統一が簡単です。
        {
+
<source lang="csharp">
            app.UseSession();
+
using Microsoft.AspNetCore.DataProtection;
        }
+
// 中略
 +
builder.Services.AddDataProtection().SetApplicationName("appName");
 
</source>
 
</source>
 +
  
 
おわり。
 
おわり。

2024年3月7日 (木) 04:01時点における版

ASP .NET CoreセッションRedisに保存したい。


実装

前提

  • ASP.NET Core 8.0.1

nuget

  • Microsoft.Extensions.Caching.StackExchangeRedis

appsettings.json

ConnectionStringsにredisの設定を書く。

{
    "ConnectionStrings": {
        "redis": "localhost:6379"
    },
    "Logging": {
        "LogLevel": {
            "Default": "Information",
            "Microsoft.AspNetCore": "Warning"
        }
    },
    "AllowedHosts": "*"
}

service

appsettings.jsonを読み込みredisサービスを追加する。

// Redisの設定
builder.Services.AddStackExchangeRedisCache(options =>
{
    options.Configuration = builder.Configuration.GetConnectionString("redis");
    options.InstanceName = "";
});

セッションの設定をする。

// セッションの設定
builder.Services..AddSession(options =>
{
    options.IdleTimeout = TimeSpan.FromMinutes(60); // セッションのタイムアウト時間
    options.Cookie.Name = "session"; // セッション用のクッキー名
    options.Cookie.IsEssential = true;
});

セッションを有効化する。

app.UseSession();

セッションの暗号化

asp.net coreではセッションデータが暗号化されます。 その関係で初期状態のままでは複数のサーバー(異なるアプリ)でデータ共有することができません。

暗号化の設定は2パターンあります。

  • アプリ名を統一する
  • 共通のキーを使う

なお、無効化はできないっぽいです。

複数のウェブサーバーのセッションを共有するだけならアプリ名の統一が簡単です。

using Microsoft.AspNetCore.DataProtection;
// 中略
builder.Services.AddDataProtection().SetApplicationName("appName");


おわり。

関連項目