net core实现分布式session,单点登录
要想在net core中实现分布式session,实现单点登录,我们可以把session保存到redis中,这样就可以多个项目共享
session,因为redis集群什么的也很方便。
把session的值保存到redis中
怎么安装redis就不说了,首先要打开redis,然后就是net core中的操作了
1:nuget下载一个依赖Microsoft.Extensions.Caching.Redis
Install-Package Microsoft.Extensions.Caching.Redis
2:在ConfigureServices配置一下让session保存到redis中
//配置session保存到redis中 services.AddDistributedRedisCache(options => { //用于连接Redis的配置 Configuration.GetConnectionString("RedisConnectionString")读取配置信息的连接字符串 options.Configuration = "localhost:6379"; //Redis实例名DemoInstance options.InstanceName = "DemoInstance"; });
如果要接密码的话可以这样:192.168.1.105:6380,password=1qaz@WSX3edc$RFV
还可以设置操作时间什么的:
public void ConfigureServices(IServiceCollection services) { //将Redis分布式缓存服务添加到服务中 services.AddDistributedRedisCache(options => { options.ConfigurationOptions = new StackExchange.Redis.ConfigurationOptions() { Password = "我不是密码", ConnectTimeout = 5000,//设置建立连接到Redis服务器的超时时间为5000毫秒 SyncTimeout = 5000,//设置对Redis服务器进行同步操作的超时时间为5000毫秒 ResponseTimeout = 5000//设置对Redis服务器进行操作的响应超时时间为5000毫秒 }; options.ConfigurationOptions.EndPoints.Add("localhost:6379"); options.InstanceName = "DemoInstance"; }); services.AddMvc(); }
3:在Configure中使用一下session的中间件
然后就可以正常的读写session了
public IActionResult Index() { string val = HttpContext.Session.GetString("test_username"); //session为空写入一条测试数据 if (string.IsNullOrEmpty(val)) { HttpContext.Session.SetString("test_username", "a"); } ViewBag.sessionid = HttpContext.Session.Id; ViewBag.val = val; return View(); }
然后居然报错了....自己测试的时候好好的,撸文章的时候居然报错了!简直可怕
哦.....太着急了第二步中应该还有一个使用session的配置忘记写了
//添加session services.AddSession(options => { options.IdleTimeout = TimeSpan.FromMinutes(10); //session活期时间 options.Cookie.HttpOnly = true;//设为httponly });
然后就成功了!在redis中可以看到session添加的数据!
当然数据是被编码了的,net core中有专门的数据保护模块是真的比较好用!
然后打开另外一个项目,重复上诉的步骤,因为session可以实现分布式扩项目访问
but其实并不行,A项目写入了session,B项目还是无法访问,于是就想这两个项目是不是有关联才行了,
从这个思路入手
实现分布式session跨项目访问
在原来framework中,session存储在redis中就可以直接实现单点登录了,但是在net core还不行,经常查询发现是因为
net core中的数据保护问题。
对于普通开发人员在编码的时候可能不会用到,但是在做系统分布式部署的时候如果你不了解这个机制可能就会遇到麻烦了
比如MachineKey:机器钥匙
或者我们去实现IXmlRepository接口,有兴趣的可以去研究一下
当然这里实现分布式session不需要那么复杂,我们只需要把需要共享session的项目设置相同的程序识别者就好了
估计设置成相同的程序识别者,net core才会认为是拥有访问那个session的权限吧,因为数据是加密的,他们也需要有相同的秘钥
然后看看最后的效果
项目A写入后读取,项目B直接读取,可以看到session和值和sessionid都一样,分布式session成功!上班!,羽毛球可以约一波
最后贴一个在原来framework下的单点登录实现:http://www.tnblog.net/aojiancc2/article/details/210