• Windows 环境下分布式跨域Session共享


    为什么还是那句话,在网上找了N篇Session共享,但真正可以直接解决问题的还是没有找到。

    一、以下为本人亲测,为防止环境不一致,对本文产生歧义,限定环境如下:

    1. IIS7.0

    2. Asp.net 的站点

    3. StateServer模式,数据库及自定义配置不在本文讨论范围。

    4. 192.168.1.41 (主站点服务器,域名:www.xxx.com)  ,192.168.1.43 (业务分发服务器 域名:BDN1.xxx.com)

    5. 实现的跨域也只是跨子域的方法。(因为最终都是读取根域下的Cookie来读取SessonID共享的)

    二、配置

    主站点服务器web.config

    1. <sessionState mode="StateServer" stateConnectionString="tcpip=192.168.1.41:42424" timeout="60"/>

    将模式改为 StateServer ,默认是关闭远程访问,需要打开注册表(regedit),HKEY_LOCAL_MACHINESYSTEMCurrentControlSetServicesaspnet_stateParameters 

    AllowRemoteConnection 改为 1 可以使用Telnet 192.168.1.41 42424 测试一下是否已经打开。

    2. <httpCookies domain="xxx.com" />

    将Cookie的Domain限定要根域名下,以使下一级的子域都可以访问到这个Cookie.

    另外提一下,如果你只是想让Session在根域下,其他的Cookie另外设置,可以使用这样的方法.

    <sessionState sessionIDManagerType ="B2BSite.MySessionIDManager" mode="StateServer" stateConnectionString="tcpip=192.168.1.41:42424" timeout="60"/>

        public class MySessionIDManager : SessionIDManager, ISessionIDManager
        {
            void ISessionIDManager.SaveSessionID(HttpContext context, string id, out bool redirected, out bool cookieAdded)
            {
                base.SaveSessionID(context, id, out redirected, out cookieAdded);
    
                if (cookieAdded)
                {
                    var name = "ASP.NET_SessionId";
                    var cookie = context.Response.Cookies[name];
                    cookie.Domain = "xxx.com";
                    cookie.Path = "/";
                }
            }
        }
    

      

    3. <machineKey decryptionKey="FD69B2EB9A11E3063518F1932E314E4AA1577BF0B824F369" validationKey="5F32295C31223A362286DD5777916FCD0FD2A8EF882783FD3E29AB1FCDFE931F8FA45A8E468B7A40269E50A748778CBB8DB2262D44A86BBCEA96DCA46CBC05C3" validation="SHA1" decryption="Auto"/>

    不同的机器会产生不一致的Session,所以需要指定MachineKey,来使不同的机器产生的Session可以相互读取.

    业务分发服务器web.config

    1. <sessionState mode="StateServer" stateConnectionString="tcpip=192.168.1.41:42424" timeout="60"/>

    tcpip=为主服务器的StateServerIP.你也可以独立出来.我这边是放在主服务器上了.

    2. <httpCookies domain="xxx.com" />

    3. <machineKey decryptionKey="FD69B2EB9A11E3063518F1932E314E4AA1577BF0B824F369" validationKey="5F32295C31223A362286DD5777916FCD0FD2A8EF882783FD3E29AB1FCDFE931F8FA45A8E468B7A40269E50A748778CBB8DB2262D44A86BBCEA96DCA46CBC05C3" validation="SHA1" decryption="Auto"/>

    这个machinekey必须与主站点服务器的machinekey 一样.

     注:最后也是最关键的一点.很多文件都没有提到,就是IIS 设置中站点的ID,两个网站必须一样,如果主站点服务器的站点ID是3,那么业务分发服务器的站点ID也必须是3.要不然就不可以访问.我在这个地方卡了很久.MSDN上有说明的.

  • 相关阅读:
    进程间通信-管道,消息,共享内存,信号量,信号,scoket
    高并发架构相关概念
    在WSL2中 安装 .NET Core SDK 进行Linux 开发工作
    OKR专题
    logback是怎么知道java代码的行数的?
    IDEA plugins
    [LeetCode] 956. Tallest Billboard 最高的广告牌
    上周热点回顾(8.10-8.16)团队
    【故障公告】腾讯云短信服务故障造成无法发送手机短信团队
    HBase~hbase-shaded-client解决包冲突问题
  • 原文地址:https://www.cnblogs.com/stangray/p/3328092.html
Copyright © 2020-2023  润新知