参考一:https://www.cnblogs.com/vipyoumay/p/7771237.html

参考二:https://www.cnblogs.com/stulzq/p/7729105.html

背景:原本使用cookie存储登录信息,使用nginx的ip_hash勉强解决多服务器问题,但是现在为了上k8s,因此使用docker,所以ip_hash没了,所以cooker方式pass掉了

过程:经过一系列baidu操作,最终觉得尝试使用 Redis 来存储 Session,以解决以上问题

总体分为两个步骤

一、存储登录信息到redis

1、添加 Microsoft.Extensions.Caching.Redis

2、在Startup.cs中添加配置

//添加redis配置
            services.AddDistributedRedisCache(option =>
            {
                //redis 连接字符串
                option.Configuration = address;
                //redis 实例名
                option.InstanceName = Configuration["InstanceName"];
            });
            //添加session配置
            services.AddSession(options =>
            {
                //session存活时间
                options.IdleTimeout = TimeSpan.FromHours(Convert.ToDouble(Configuration["SessionTimeOut"]));
                //设为httponly
                options.Cookie.HttpOnly = true;
            });
//启用session
app.UseSession();

3、使用用session

//
HttpContext.Session.SetString("UserId", user.UserId);
//
string UserId = HttpContext.Session.GetString("UserId")
//清除()
HttpContext.Session.Clear();

二、存储sessionid到redis

 1、添加 ServiceStack.Redis.Core

 2、添加配置

//添加数据保护(把sessionid存储到redis)
            services.AddDataProtection()
                .SetApplicationName("session_redis_application_name")
                .PersistKeysToStackExchangeRedis(Helper.getSessionConfig("address"), "DataProtection-Keys");
/// <summary>
        /// 获取session配置
        /// </summary>
        /// <param name="address"></param>
        /// <returns></returns>
        public static StackExchange.Redis.ConnectionMultiplexer getSessionConfig(string address)
        {
            var redis = StackExchange.Redis.ConnectionMultiplexer.Connect(address);
            return redis;
        }

注意:这里有一个坑,ConnectionMultiplexer需要引用的命名空间有冲突,网上有说改名字能解决,但是我尝试失败了,也许是我的方式不对

我的项目是多层项目,所以我就把【获取session配置】放到Commin类库中,就解决了这个冲突

亲测有效