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

提供:MonoBook
imported>Administrator
編集の要約なし
編集の要約なし
 
(2人の利用者による、間の8版が非表示)
1行目: 1行目:
[[ASP .NET Core]]の[[セッション]]を[[Redis]]に保存したい。
[[ASP .NET Core]]の[[セッション]]を[[Redis]]に保存したい。


; 前提
* ASP .NET Core 1.1を使用
* Redisサーバーは立ち上がっていること
*: この例では[[QNAP]]上の[[Docker]]で[[Redis]]を立ち上げているのでポート番号が一般的ではない点に注意


; 使用するNuGetパッケージ
== 前提 ==
* Microsoft.Extensions.Caching.Redis
* ASP.NET Core 8.0.1
* Microsoft.AspNetCore.Session
どちらのパッケージもASP .NET Core 2.0版が最新なので、[[NuGet]]から入れるときにバージョン指定で1.x系を入れている。


; Startup.csでサービス追加をして使用宣言をする。
== 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");
    options.InstanceName = "";
});
</source>
 
セッションの設定をする。
<source lang="csharp">
<source lang="csharp">
        public void ConfigureServices(IServiceCollection services)
// セッションの設定
        {
builder.Services.AddSession(options =>
            // Add framework services.
{
    options.IdleTimeout = TimeSpan.FromMinutes(60); // セッションのタイムアウト時間
    options.Cookie.Name = "session"; // セッション用のクッキー名
    //options.Cookie.IsEssential = true;
});
</source>


            // Redis Session
セッションを有効化する。
            services.AddDistributedRedisCache(options =>
<source lang="csharp">
            {
app.UseSession();
                options.Configuration = "192.168.10.20:32776";
</source>
                options.InstanceName = "";
            });


            services.AddSession(options =>
=== セッションの暗号化 ===
            {
asp.net coreではセッションデータ(や一時データなどはすべて)は問答無用で暗号化されます。デバッグ時であろうと無効化はできないっぽいです。その関係で初期状態のままでは複数のサーバー(異なるアプリ)でデータ共有することができません。このままではバックエンドに[[redis]]を使っている意味ないです。はい。
                options.CookieName = "session";
                options.IdleTimeout = TimeSpan.FromMinutes(60);
            });


            services.AddMvc();
暗号化の設定は2パターンあるようです。
        }
* アプリ名を統一する
* 共通のキーを使う


        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:36時点における最新版

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


前提[編集 | ソースを編集]

  • ASP.NET Core 8.0.1

nuget[編集 | ソースを編集]

RedisNuGetを入れる。

  • Microsoft.Extensions.Caching.StackExchangeRedis

appsettings.json[編集 | ソースを編集]

ConnectionStringsにredisの設定を書く。

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

serviceとapp[編集 | ソースを編集]

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ではセッションデータ(や一時データなどはすべて)は問答無用で暗号化されます。デバッグ時であろうと無効化はできないっぽいです。その関係で初期状態のままでは複数のサーバー(異なるアプリ)でデータ共有することができません。このままではバックエンドにredisを使っている意味ないです。はい。

暗号化の設定は2パターンあるようです。

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

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

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


おわり。

関連項目[編集 | ソースを編集]