netcore 实现跨应用的分布式session
2024-09-01 09:37:17
需求场景
- 网站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;
}
...
}
最新文章
- Java--String 和StringBuilder、StringBuffer 的区别?
- log4j2.xml实用例子
- ffmpeg-20160822-bin.7z
- Java 如何跳出多重嵌套循环体?
- Python操作Redis、Memcache、RabbitMQ、SQLAlchemy
- document的createDocumentFragment()方法
- css去掉a标签点击后的虚线框
- MySQL 知识点
- 了解php的session_start的工作原理
- springmvc问题汇总
- PL/SQL + Oracle客户端 配置记录
- Sublime Text3安装evernote插件
- 基于python的Selenium使用小结
- Visual Studio安装SVN插件
- tomcat 配置 使用 HTTPS
- Sap R/3 Architecture Tutorial
- ABP实战--项目结构
- 重写 View 的 Touch 方法,实现一个酷炫的九宫格图片
- 接口自动化(五)--打印log到文档
- 说说ASP.NET的IsPostBack
热门文章
- 出现 java.lang.OutOfMemoryError: PermGen space 错误的原因及解决方法
- MySQL索引原理(二)
- spring boot允许跨域(CORS)的配置
- java.lang.Exception: No tests found matching
- mysql数据库架构设计与优化
- 自动化办公:python操作Excel
- Python - Django - form 组件动态从数据库取 choices 数据
- springboot:自定义缓存注解,实现生存时间需求
- axios get,post请求时带headers
- zabbix自动停用与开启agent