• 需求场景

    • 网站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;
        }
        ...
        }

最新文章

  1. Java--String 和StringBuilder、StringBuffer 的区别?
  2. log4j2.xml实用例子
  3. ffmpeg-20160822-bin.7z
  4. Java 如何跳出多重嵌套循环体?
  5. Python操作Redis、Memcache、RabbitMQ、SQLAlchemy
  6. document的createDocumentFragment()方法
  7. css去掉a标签点击后的虚线框
  8. MySQL 知识点
  9. 了解php的session_start的工作原理
  10. springmvc问题汇总
  11. PL/SQL + Oracle客户端 配置记录
  12. Sublime Text3安装evernote插件
  13. 基于python的Selenium使用小结
  14. Visual Studio安装SVN插件
  15. tomcat 配置 使用 HTTPS
  16. Sap R/3 Architecture Tutorial
  17. ABP实战--项目结构
  18. 重写 View 的 Touch 方法,实现一个酷炫的九宫格图片
  19. 接口自动化(五)--打印log到文档
  20. 说说ASP.NET的IsPostBack

热门文章

  1. 出现 java.lang.OutOfMemoryError: PermGen space 错误的原因及解决方法
  2. MySQL索引原理(二)
  3. spring boot允许跨域(CORS)的配置
  4. java.lang.Exception: No tests found matching
  5. mysql数据库架构设计与优化
  6. 自动化办公:python操作Excel
  7. Python - Django - form 组件动态从数据库取 choices 数据
  8. springboot:自定义缓存注解,实现生存时间需求
  9. axios get,post请求时带headers
  10. zabbix自动停用与开启agent