netcore 实现跨应用的分布式session
程序员文章站
2022-05-03 14:50:10
需求场景 网站a,域名为 a.site.com 网站b, 域名为 b.site.com 需要在a、b两个站点之间共享session 解决方案 使用redis作为分布式缓存存储 设置sessionId cookie 保存的域名,使得两个网站钧能够读取到相同的sessionId 自定义SessionMi ......
-
需求场景
- 网站a,域名为 a.site.com
- 网站b, 域名为 b.site.com
- 需要在a、b两个站点之间共享session
-
解决方案
- 使用redis作为分布式缓存存储
- 设置sessionid cookie 保存的域名,使得两个网站钧能够读取到相同的sessionid
services.adddistributedrediscache(options => //使用redis { options.configuration = $"{conf},defaultdatabase={dbid}"; }); services.addsession(options => { options.idletimeout = timespan.fromminutes(30); options.cookie.domain = "site.com"; });
-
自定义sessionmiddleware
由于asp.net 自带的sessionmiddleware中间中对sessionid做了加密处理,导致不同应用虽然sessionid相同,但是并不能成功的共享session,具体详件sessionmiddleware源码,其中使用了cookieprotection类的对sessionid进行了加密
public async task invoke(httpcontext context) { .... if (string.isnullorwhitespace(sessionkey) || sessionkey.length != sessionkeylength) { // no valid cookie, new session. var guidbytes = new byte[16]; cryptorandom.getbytes(guidbytes); sessionkey = new guid(guidbytes).tostring(); cookievalue = cookieprotection.protect(_dataprotector, sessionkey); var establisher = new sessionestablisher(context, cookievalue, _options); tryestablishsession = establisher.tryestablishsession; isnewsessionkey = true; } ... }
-
由于sessionmiddleware是直接依赖类cookieprotection,因此需要重新实现自己的中间件来处理session,比如实现一个mysessionmiddleware,即可实现session共享
public async task invoke(httpcontext context) { .... if (string.isnullorwhitespace(sessionkey) || sessionkey.length != sessionkeylength) { // no valid cookie, new session. var guidbytes = new byte[16]; cryptorandom.getbytes(guidbytes); sessionkey = new guid(guidbytes).tostring(); cookievalue = md5(sessionkey);//此处可以使用自己的加密规则,重要的是保证不同的应用,通过加密规则生成的值是相同的 var establisher = new sessionestablisher(context, cookievalue, _options); tryestablishsession = establisher.tryestablishsession; isnewsessionkey = true; } ... }
上一篇: IOC控制反转
推荐阅读
-
基于Redis实现分布式应用限流的方法
-
ThinkPHP框架实现session跨域问题的解决方法
-
spring boot整合redis实现shiro的分布式session共享的方法
-
ThinkPHP框架实现session跨域问题的解决方法
-
PHP实现cookie跨域session共享的方法分析
-
PHP实现分布式memcache设置web集群session同步的方法
-
解析php中session的实现原理以及大网站应用应注意的问题
-
Spring Boot分布式系统实践【扩展1】shiro+redis实现session共享、simplesession反序列化失败的问题定位及反思改进
-
ELK分布式日志+NLog在.NetCore中的应用
-
物联网框架ServerSuperIO在.NetCore实现跨平台的实践路线