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_MACHINE\SYSTEM\CurrentControlSet\Services\aspnet_state\Parameters 

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上有說明的.

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM