熱點推薦:
您现在的位置: 電腦知識網 >> 編程 >> .NET編程 >> 正文

Session共享的解決方案

2013-11-13 09:54:57  來源: .NET編程 

  客戶端SessionID值唯一

  對於不同的域名主域名子域名跨站點域名或跨服務器域名用戶在打開頁面時會產生不同的SessionID

  為了使這些站點在用戶登錄時只登錄一次那我們就要解決SessionID的問題必須使SessionID在這些共享Session的站點中只產生一次而SessionID是存儲在客戶端的cookie之中鍵值為ASPNET_SessionId的一個字符串(也可以存儲在URL中這裡不作使介紹)為此只須使各站點存儲的SPNET_SessionId唯一即可

  因每個客戶端在打開時會產生一個SessionID為此我們要做的就是重置SessionID我們可以在繼承HttpModule在結束請求時重寫SessionID

  代碼如下

  public class MakeSessionIDOneOnly : IHttpModule    {        private string m_RootDomain = stringEmpty;        #region IHttpModule Members        public void Dispose()        {                    }        public void Init(HttpApplication context)        {            m_RootDomain = ConfigurationManagerAppSettings[RootDomain];            Type stateServerSessionProvider = typeof(HttpSessionState)AssemblyGetType(SystemWebSessionStateOutOfProcSessionStateStore);            FieldInfo uriField = stateServerSessionProviderGetField(s_uribase BindingFlagsStatic | BindingFlagsNonPublic);            if (uriField == null)                throw new ArgumentException(UriField was not found);            uriFieldSetValue(null m_RootDomain);                        contextEndRequest += new SystemEventHandler(context_EndRequest);        }        void context_EndRequest(object sender SystemEventArgs e)        {            HttpApplication app = sender as HttpApplication;            for (int i = ; i < appContextResponseCookiesCount; i++)            {                if (appContextResponseCookies[i]Name == ASPNET_SessionId)                {                    appContextResponseCookies[i]Domain = m_RootDomain;                }            }        }        #endregion    }

  為使用以上代碼須配置下面節點項

  <httpModules>

  <add name=節點名稱 type=類名全稱 程序集/>

  </httpModules>

  Session值的共享

  配置sessionState置節點使用StateServer或SQLServer來實現Session共享

  為實現跨服務器共享必須在nfig配置

  <machineKey decryptionKey=FDBEBAEFEEAABFBF validationKey=FCADDFCDFDAEFFDEABFCDFEFFAAEBAEACBBDBDABBCEADCACBCC validation=SHA decryption=Auto/>

  並且不同服務器上站點配置必須用相同的nfig各站點目錄配置也要相同

  使用StateServer

  存儲Session的服務器必須開啟StateServerASPNET狀態服務只有機器重起的情況下才導致Session丟失

  <sessionState cookieless=false timeout= mode=StateServer stateConnectionString=tcpip=IpAddress:/>

  若StateServer在本機存儲則IpAddress為若StateServer為遠程服務器則為IpAddress為遠程服務器IP地址並且修改注冊表項如下

  Windows Registry Editor Version

  [HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\aspnet_state\Parameters]

  Port=dword:ab

  AllowRemoteConnection=dword:

  使用SQLServer

  必須開啟SQLServer代理服務此服務負責清除過期的Session若沒有開服務則Session不會過期

  使用SQLServer在機器重啟後Session不會丟失

  nfig配置

  <sessionState mode=SQLServer sqlConnectionString=server=DBIpAddress; uid=myid; pwd=mypwd;/>

  數據庫配置

  使用aspnet_regsqlexe工具

  ASPNET 版本後微軟提供了aspnet_regsqlexe工具可以方便的配置Session數據庫該工具位於 Web 服務器上的系統根目錄\MicrosoftNET\Framework\版本號文件夾中

  使用舉例:

  aspnet_regsqlexe S U sa P ssadd sstype p

  S參數:

  表示數據庫實例名稱 可以用表示本機

  U和P參數:

  表示用戶名和密碼

  E參數:

  可以再U –P 與 E中選擇一組 –E表示以當前系統用戶通過windows身份驗證登錄數據庫 U P則是使用SqlServer用戶登錄數據庫

  ssadd / –ssremove 參數:

  ssadd表示是添加Session數據庫 ssremove表示移除Session數據庫

  sstype 參數說明:

  

  t

  將會話數據存儲到 SQL Server tempdb 數據庫中這是默認設置如果將會話數據存儲到 tempdb 數據庫中則在重新啟動 SQL Server 時將丟失會話數據

  p

  將會話數據存儲到 ASPState 數據庫中而不是存儲到 tempdb 數據庫中

  c

  將會話數據存儲到自定義數據庫中如果指定 c 選項則還必須使用 d 選項包括自定義數據庫的名稱

  sessionState參數說明

  

  屬性

  說明

  allowCustomSqlDatabase

  可選的 Boolean 屬性

  指定會話狀態 SQL 數據庫是否可以是自定義數據庫(而不是 ASPNET 默認數據庫)如果為 false則不能指定初始目錄或數據庫作為 sqlConnectionString 屬性的值默認會話狀態 SQL 數據庫為 ASPState 數據庫有關更多信息請參見會話狀態模式

  此屬性是 NET Framework 版中的新屬性

  默認值為 false

  cookieless

  可選的 HttpCookieMode 屬性

  指定對於 Web 應用程序使用 Cookie 的方式

  cookieless 屬性可以為下列可能值之一默認值為 UseCookies

  值

  說明

  AutoDetect

  ASPNET 確定請求浏覽器或請求設備是否支持 Cookie如果請求浏覽器或請求設備支持 Cookie則 AutoDetect 使用 Cookie 來保留用戶數據否則將在查詢字符串中使用一個標識符如果浏覽器或設備支持 Cookie但當前禁用了 Cookie則請求功能仍會使用 Cookie

  UseCookies

  無論浏覽器或設備是否支持 Cookie都使用 Cookie 來保留用戶數據

  UseDeviceProfile

  ASPNET 根據 HttpBrowserCapabilities 設置來確定是否使用 Cookie如果 HttpBrowserCapabilities 設置指示浏覽器或設備支持 Cookie將使用 Cookie否則將在查詢字符串中使用一個標識符

  UseUri

  無論浏覽器或設備是否支持 Cookie調用功能都使用查詢字符串來存儲標識符

  cookieName

  可選的 String 屬性

  指定存儲會話標識符的 Cookie 的名稱

  此屬性是 NET Framework 版中的新屬性

  默認值為 ASPNET_SessionId

  customProvider

  可選的 String 屬性

  指定用於存儲和檢索會話狀態數據的自定義會話狀態提供程序的名稱該提供程序在 providers 元素中指定僅當會話狀態模式設置為 Custom 值時才使用該提供程序有關更多信息請參見會話狀態模式

  此屬性是 NET Framework 版中的新屬性

  默認值為空字符串 ()

  mode

  可選的 SessionStateMode 屬性

  指定存儲會話狀態值的位置有關更多信息請參見會話狀態模式

  mode 屬性可以為下列可能值之一默認值為 InProc

  值

  說明

  Custom

  會話狀態將使用自定義數據存儲區來存儲會話狀態信息

  InProc

  會話處於正在處理 ASPNET 輔助進程的狀態

  Off

  會話狀態被禁用

  SQLServer

  會話狀態將使用進程外 SQL Server 數據庫來存儲狀態信息

  StateServer

  會話狀態將使用進程外 ASPNET 狀態服務來存儲狀態信息

  partitionResolverType

  可選的 String 屬性

  指定在哪裡存儲會話狀態如果 partitionResolverType 屬性中指定了值則忽略 sqlConnectionString 和 stateConnectionString 屬性PartitionResolverType 屬性返回的連接字符串將用於每個請求為請求的其余部分連接到適當的服務器位置如果連接字符串無效ASPNET 將引發一個異常該異常與當配置的服務器連接字符串無效時引發的異常相同該屬性用於在 SQL 或狀態服務器模式下在多個後端節點上劃分會話狀態數據

  此屬性是 NET Framework 版中的新屬性

  默認值為空字符串

  regenerateExpiredSessionId

  可選的 Boolean 屬性

  指定當客戶端指定了過期的會話 ID 時是否重新發出會話 ID默認情況下當啟用了 regenerateExpiredSessionId 時僅為 cookieless 模式重新發出會話 ID有關更多信息請參見 IsCookieless

  此屬性是 NET Framework 版中的新屬性

  默認值為 true

  sqlCommandTimeout

  可選的 TimeSpan 屬性

  指定使用 SQL Server 會話狀態模式的 SQL 命令的持續時間超時(秒)持續時間超時是 SQL 命令可以處於空閒狀態的時間(秒)超過此時間之後該命令將被取消

  此屬性是 NET Framework 版中的新屬性

  默認值為 :: 秒)

  sqlConnectionString

  可選的 String 屬性

  為運行 SQL Server 的計算機指定連接字符串該屬性在 mode 屬性設置為 SQLServer 值時是必需的有關更多信息請參見會話狀態模式

  注意

  若要在使用 SQLServer 模式時提高您的應用程序的安全性請使用受保護的配置來加密配置的 sessionState 節以幫助保護 sqlConnectionString 值

  默認值為 data source=;Integrated Security=SSPI

  stateConnectionString

  可選的 String 屬性

  指定遠程存儲會話狀態的服務器名稱或地址以及端口端口值必須為 當 mode 為 StateServer 值時該屬性是必需的確保運行 ASPNET 狀態服務的服務器是存儲會話狀態信息的遠程服務器該服務隨 ASPNET 一起安裝默認情況下為 %SystemRoot%\MicrosoftNET\Framework\VersionNumber\aspnet_stateexe有關更多信息請參見會話狀態模式

  注意

  若要在使用 StateServer 模式時提高您的應用程序的安全性請使用受保護的配置來加密配置的 <sessionState> 節以幫助保護 stateConnectionString 值

  默認值為 tcpip=:

  stateNetworkTimeout

  可選的 TimeSpan 屬性

  指定 Web 服務器與狀態服務器之間的 TCP/IP 網絡連接可以處於空閒狀態的時間(秒)超過此時間後請求將被取消該屬性在 mode 屬性設置為 StateServer 值時使用

  默認值為

  timeout

  可選的 TimeSpan 屬性

  指定在放棄一個會話前該會話可以處於空閒狀態的分鐘數對於進程內和狀態服務器模式timeout 屬性不能設置為大於 分鐘( 年)的值

  會話 timeout 配置設置僅適用於 ASPNET 頁更改會話 timeout 值不會影響 ASP 頁的會話超時時間同樣更改 ASP 頁的會話超時時間不會影響 ASPNET 頁的會話超時時間

  默認值為 分鐘

  useHostingIdentity

  可選的 Boolean 屬性

  指定會話狀態將恢復為宿主標識還是使用客戶端模擬

  如果為 trueASPNET 將使用下列進程憑據之一來連接會話狀態存儲區

  宿主進程對於 Microsoft Internet 信息服務 [IIS] 版為 ASPNET對於 Microsoft Windows Server 則為 NETWORK SERVICE

  應用程序模擬標識當使用了以下配置時使用此憑據

  <identity impersonate=true userName=user password=pwd />

  如果為 falseASPNET 將使用目前與當前請求的操作系統線程關聯的憑據來連接會話狀態存儲區對於客戶端模擬ASPNET 將使用與浏覽器協商的安全憑據來連接會話狀態存儲區如果為 falseASPNET 在連接會話狀態存儲區時不會恢復為進程標識或應用程序模擬標識有關更多信息請參見 ASPNET 模擬

  此屬性是 NET Framework 版中的新屬性

  默認值為 true

  注意

  在 NET Framework 版中如果 mode 屬性設置為 SQLServer並且客戶端模擬有效則 ASPNET 使用來自 ASPNET 客戶端模擬的客戶端憑據連接到運行 SQL Server 的計算機

  繼承的屬性

  可選的屬性

  由所有節元素繼承的屬性


From:http://tw.wingwit.com/Article/program/net/201311/11956.html
  • 上一篇文章:

  • 下一篇文章:
  • 推薦文章
    Copyright © 2005-2013 電腦知識網 Computer Knowledge   All rights reserved.