• 需求场景

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

netcore 实现跨应用的分布式session的更多相关文章

  1. 使用Spring Session和Redis解决分布式Session跨域共享问题

    http://blog.csdn.net/xlgen157387/article/details/57406162 使用Spring Session和Redis解决分布式Session跨域共享问题

  2. 170222、使用Spring Session和Redis解决分布式Session跨域共享问题

    使用Spring Session和Redis解决分布式Session跨域共享问题 原创 2017-02-27 徐刘根 Java后端技术 前言 对于分布式使用Nginx+Tomcat实现负载均衡,最常用 ...

  3. 分布式session的实现

    一.分布式Session的几种实现方式 1.基于数据库的Session共享 2.基于NFS共享文件系统3.基于memcached 的session,如何保证 memcached 本身的高可用性?4. ...

  4. 基于ZooKeeper的分布式Session实现(转)

    1.   认识ZooKeeper ZooKeeper—— “动物园管理员”.动物园里当然有好多的动物,游客可以根据动物园提供的向导图到不同的场馆观赏各种类型的动物,而不是像走在原始丛林里,心惊胆颤的被 ...

  5. 基于ZooKeeper的分布式Session实现

    1.   认识ZooKeeper ZooKeeper—— “动物园管理员”.动物园里当然有好多的动物,游客可以根据动物园提供的向导图到不同的场馆观赏各种类型的动物,而不是像走在原始丛林里,心惊胆颤的被 ...

  6. 基于redis实现分布式Session

    学习到好的知识还是需要记录下来的. 开发环境 asp.net mvc4,iis.asp.net 自带的session机制存在诸多不好的地方.先只要列出几点. asp.net mvc 默认的sessio ...

  7. Spring Session解决分布式Session问题的实现原理

    使用Spring Session和Redis解决分布式Session跨域共享问题 上一篇介绍了如何使用spring Session和Redis解决分布式Session跨域共享问题,介绍了一个简单的案例 ...

  8. 使用ZooKeeper实现Java跨JVM的分布式锁

    一.使用ZooKeeper实现Java跨JVM的分布式锁 二.使用ZooKeeper实现Java跨JVM的分布式锁(优化构思) 三.使用ZooKeeper实现Java跨JVM的分布式锁(读写锁) 说明 ...

  9. Java Web学习总结(20)——基于ZooKeeper的分布式session实现

    1.   认识ZooKeeper ZooKeeper-- "动物园管理员".动物园里当然有好多的动物,游客可以根据动物园提供的向导图到不同的场馆观赏各种类型的动物,而不是像走在原始 ...

随机推荐

  1. UE运行sas配置-WIN10

    1.在UE中配置SAS运行的工具: UE--高级---用户工具--工具配置 在命令行输入"D:\soft\SASHome\SASFoundation\9.4\sas.exe" -c ...

  2. [Web] HTML5新特性history pushState/replaceState解决浏览器刷新缓存

    转载: https://www.jianshu.com/p/cf63a1fabc86 现实开发中,例如‘商品列表页’跳转‘商品详情页’,返回时,不重新加载刷新页面,并且滚动到原来的位置. 1.首先,先 ...

  3. tig

    /******************************************************************************* * tig * 说明: * tig便于 ...

  4. gradle/gradle plugin/Android studio关系

    gradle - 构建工具,存储于Users/stono/.gradle/wrapper/dists Adroid Studio- IDE Gradle plugin - 在AS中使用Gradle的插 ...

  5. BicycleGAN: Toward Multimodal Image-to-Image Translation - 1 - 论文学习,成对数据

    Abstract 许多图像到图像的翻译问题是有歧义的,因为一个输入图像可能对应多个可能的输出.在这项工作中,我们的目标是在一个条件生成模型设置中建立可能的输出分布.将模糊度提取到一个低维潜在向量中,在 ...

  6. android mk 预编译库

    LOCAL_PATH := $(call my-dir) #include $(CLEAR_VARS) # OpenCV #OPENCV_CAMERA_MODULES:=on #OPENCV_INST ...

  7. WebGL学习笔记(十六):遮罩

    这里总结下几种WebGL中实现遮罩的方法. 模板缓冲 模板缓冲可以实现渲染剔除,但是我们之前的学习里,剔除范围是基于上一次渲染的结果,且上一次的渲染也会进行显示,这样的话并不适合用来实现遮罩. 我们想 ...

  8. openvswitch2.11.0修改源码后重新编译

    一:推文 https://www.jianshu.com/p/923f49c290f5(可以删除运行当中的DataPath内核) https://github.com/ebiken/doc-netwo ...

  9. fastreport 条形码 宽度问题

    fastreport 的barcode 如果不设置AutoSize 确实可以控制宽度 但是生成后 基本没办法扫 所以换个思路 直接等比缩小 设置里面的zoom 比例为0.8  针对20位左右的条形码就 ...

  10. java Random 随机重排

    将一个数组或序列随机重新排列. /** * Created by xc on 2019/11/23 * 随机重排 */ public class Test7_7 { public static voi ...