Session共用的解決方案
1、用戶端SessionID值唯一;
對於不同的網域名稱:主網域名稱、子網域名稱、跨網站網域名稱或跨伺服器網域名稱,使用者在開啟頁面時會產生不同的SessionID,
為了使這些網站在使用者登入時只登入一次,那我們就要解決SessionID的問題,必須使SessionID在這些共用Session的網站中只產生一次。而SessionID是儲存在用戶端的cookie之中索引值為ASP.NET_SessionId的一個字串(也可以儲存在URL中,這裡不作使介紹),為此只須使各網站儲存的SP.NET_SessionId唯一即可。
因每個用戶端在開啟時會產生一個SessionID,為此我們要做的就是重設SessionID。我們可以在繼承HttpModule,在結束請求時重寫SessionID。
代碼如下
public class MakeSessionIDOneOnly : IHttpModule
{
private string m_RootDomain = string.Empty;
#region IHttpModule Members
public void Dispose()
{
}
public void Init(HttpApplication context)
{
m_RootDomain = ConfigurationManager.AppSettings["RootDomain"];
Type stateServerSessionProvider = typeof(HttpSessionState).Assembly.GetType("System.Web.SessionState.OutOfProcSessionStateStore");
FieldInfo uriField = stateServerSessionProvider.GetField("s_uribase", BindingFlags.Static | BindingFlags.NonPublic);
if (uriField == null)
throw new ArgumentException("UriField was not found");
uriField.SetValue(null, m_RootDomain);
context.EndRequest += new System.EventHandler(context_EndRequest);
}
void context_EndRequest(object sender, System.EventArgs e)
{
HttpApplication app = sender as HttpApplication;
for (int i = 0; i < app.Context.Response.Cookies.Count; i++)
{
if (app.Context.Response.Cookies[i].Name == "ASP.NET_SessionId")
{
app.Context.Response.Cookies[i].Domain = m_RootDomain;
}
}
}
#endregion
}
為使用以上代碼,須配置下面節點項。
<httpModules>
<add name="節點名稱" type="類名全稱, 程式集"/>
</httpModules>
2、Session值的共用;
配置sessionState置節點,使用StateServer或SQLServer來實現Session共用。
為實現跨伺服器共用,必須在Web.config配置:
<machineKey decryptionKey="FD69B2EB9A11E3063518F1932E314E4AA1577BF0B824F369" validationKey="5F32295C31223A362286DD5777916FCD0FD2A8EF882783FD3E29AB1FCDFE931F8FA45A8E468B7A40269E50A748778CBB8DB2262D44A86BBCEA96DCA46CBC05C3" validation="SHA1" decryption="Auto"/>
並且,不同伺服器上網站配置必須用相同的Web.config,各網站目錄配置也要相同。
2.1、使用StateServer:
儲存Session的伺服器必須開啟StateServer:ASP.NET狀態服務。只有機器重起的情況下才導致Session丟失。
<sessionState cookieless="false" timeout="50" mode="StateServer" stateConnectionString="tcpip=IpAddress:42424"/>
若StateServer在本機儲存,則IpAddress為:127.0.0.1;若StateServer為遠程伺服器,則為IpAddress為遠程伺服器IP地址,並且修改登錄機碼如下:
Windows Registry Editor Version 5.00
[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\aspnet_state\Parameters]
"Port"=dword:0000a5b8
"AllowRemoteConnection"=dword:00000001
2.2、使用SQLServer:
必須開啟SQLServer代理服務,此服務負責清除到期的Session,若沒有開服務,則Session不會到期。
使用SQLServer在機器重啟後Session不會丟失。
Web.config配置:
<sessionState mode="SQLServer" sqlConnectionString="server=DBIpAddress; uid=myid; pwd=mypwd;"/>
資料庫配置:
使用aspnet_regsql.exe工具
ASP.NET 2.0版本後微軟提供了aspnet_regsql.exe工具可以方便的配置Session資料庫.該工具位於 Web 服務器上的"系統根目錄\Microsoft.NET\Framework\版本號碼"檔案夾中.
使用舉例:
aspnet_regsql.exe -S . -U sa -P 123456 -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 資料庫是否可以是自訂資料庫(而不是 ASP.NET 預設資料庫)。如果為 false,則不能指定初始目錄或資料庫作為 sqlConnectionString 屬性的值。預設工作階段狀態 SQL 資料庫為 ASPState 資料庫。有關更多資訊,請參見工作階段狀態模式。 此屬性是 .NET Framework 2.0 版中的新屬性。 預設值為 false。 |
cookieless |
可選的 HttpCookieMode 屬性。 指定對於 Web 應用程式使用 Cookie 的方式。 cookieless 屬性可以為下列可能值之一。預設值為 UseCookies。
值 |
說明 |
AutoDetect |
ASP.NET 確定請求瀏覽器或請求裝置是否支援 Cookie。如果請求瀏覽器或請求裝置支援 Cookie,則 AutoDetect 使用 Cookie 來保留使用者資料;否則,將在查詢字串中使用一個標識符。如果瀏覽器或裝置支援 Cookie,但當前禁用了 Cookie,則請求功能仍會使用 Cookie。 |
UseCookies |
無論瀏覽器或裝置是否支援 Cookie,都使用 Cookie 來保留使用者資料。 |
UseDeviceProfile |
ASP.NET 根據 HttpBrowserCapabilities 設定來確定是否使用 Cookie。如果 HttpBrowserCapabilities 設定指示瀏覽器或裝置支援 Cookie,將使用 Cookie;否則,將在查詢字串中使用一個標識符。 |
UseUri |
無論瀏覽器或裝置是否支援 Cookie,調用功能都使用查詢字串來儲存標識符。 |
|
cookieName |
可選的 String 屬性。 指定儲存工作階段識別項的 Cookie 的名稱。 此屬性是 .NET Framework 2.0 版中的新屬性。 預設值為 "ASP.NET_SessionId"。 |
customProvider |
可選的 String 屬性。 指定用於儲存和檢索工作階段狀態資料的自訂工作階段狀態提供者的名稱。該提供者在 providers 元素中指定。僅當工作階段狀態模式設定為 Custom 值時,才使用該提供者。有關更多資訊,請參見工作階段狀態模式。 此屬性是 .NET Framework 2.0 版中的新屬性。 預設值為空白字串 ("")。 |
mode |
可選的 SessionStateMode 屬性。 指定儲存工作階段狀態值的位置。有關更多資訊,請參見工作階段狀態模式。 mode 屬性可以為下列可能值之一。預設值為 InProc。
值 |
說明 |
Custom |
工作階段狀態將使用自訂資料存放區區來儲存工作階段狀態資訊。 |
InProc |
會話處於正在處理 ASP.NET 輔助進程的狀態。 |
Off |
工作階段狀態被禁用。 |
SQLServer |
工作階段狀態將使用進程外 SQL Server 資料庫來儲存狀態資訊。 |
StateServer |
工作階段狀態將使用進程外 ASP.NET 狀態服務來儲存狀態資訊。 |
|
partitionResolverType |
可選的 String 屬性。 指定在哪裡儲存工作階段狀態。如果 partitionResolverType 屬性中指定了值,則忽略 sqlConnectionString 和 stateConnectionString 屬性。PartitionResolverType 屬性返回的連接字串將用於每個請求,為請求的其餘部分串連到適當的伺服器位置。如果連接字串無效,ASP.NET 將引發一個異常,該異常與當配置的伺服器連接字串無效時引發的異常相同。該屬性用於在 SQL 或狀態伺服器模式下在多個後端節點上劃分工作階段狀態資料。 此屬性是 .NET Framework 2.0 版中的新屬性。 預設值為空白字串。 |
regenerateExpiredSessionId |
可選的 Boolean 屬性。 指定當用戶端指定了到期的會話 ID 時是否重新發出會話 ID。預設情況下,當啟用了 regenerateExpiredSessionId 時,僅為 cookieless 模式重新發出會話 ID。有關更多資訊,請參見 IsCookieless。 此屬性是 .NET Framework 2.0 版中的新屬性。 預設值為 true。 |
sqlCommandTimeout |
可選的 TimeSpan 屬性。 指定使用 SQL Server 工作階段狀態模式的 SQL 命令的期間逾時(秒)。期間逾時是 SQL 命令可以處於空閑狀態的時間(秒),超過此時間之後,該命令將被取消。 此屬性是 .NET Framework 2.0 版中的新屬性。 預設值為 0:00:30(30 秒)。 |
sqlConnectionString |
可選的 String 屬性。 為運行 SQL Server 的電腦指定連接字串。該屬性在 mode 屬性設定為 SQLServer 值時是必需的。有關更多資訊,請參見工作階段狀態模式。
注意 |
若要在使用 SQLServer 模式時提高您的應用程式的安全性,請使用受保護的配置來加密配置的 sessionState 節,以協助保護 sqlConnectionString 值。 |
預設值為 "data source=127.0.0.1;Integrated Security=SSPI"。 |
stateConnectionString |
可選的 String 屬性。 指定遠程儲存工作階段狀態的伺服器名稱或地址以及連接埠。連接埠值必須為 42424。當 mode 為 StateServer 值時,該屬性是必需的。確保運行 ASP.NET 狀態服務的伺服器是儲存工作階段狀態資訊的遠程伺服器。該服務隨 ASP.NET 一起安裝,預設情況下為 %SystemRoot%\Microsoft.NET\Framework\VersionNumber\aspnet_state.exe。有關更多資訊,請參見工作階段狀態模式。
注意 |
若要在使用 StateServer 模式時提高您的應用程式的安全性,請使用受保護的配置來加密配置的 <sessionState> 節,以協助保護 stateConnectionString 值。 |
預設值為 "tcpip=127.0.0.1:42424"。 |
stateNetworkTimeout |
可選的 TimeSpan 屬性。 指定 Web 服務器與狀態伺服器之間的 TCP/IP 網路連接可以處於空閑狀態的時間(秒),超過此時間後,請求將被取消。該屬性在 mode 屬性設定為 StateServer 值時使用。 預設值為 10 秒。 |
timeout |
可選的 TimeSpan 屬性。 指定在放棄一個會話前該會話可以處於空閑狀態的分鐘數。對於進程內和狀態伺服器模式,timeout 屬性不能設定為大於 525,601 分鐘(1 年)的值。 會話 timeout 配置設定僅適用於 ASP.NET 頁。更改會話 timeout 值不會影響 ASP 頁的會話逾時時間。同樣,更改 ASP 頁的會話逾時時間不會影響 ASP.NET 頁的會話逾時時間。 預設值為 20 分鐘。 |
useHostingIdentity |
可選的 Boolean 屬性。 指定工作階段狀態將恢複為宿主標識還是使用用戶端類比。 如果為 true,ASP.NET 將使用下列進程憑據之一來串連工作階段狀態儲存區: 宿主進程;對於 Microsoft Internet 資訊服務 [IIS] 5 和 5.1 版為 ASPNET,對於 Microsoft Windows Server 2003 則為 NETWORK SERVICE。 應用程式類比標識,當使用了以下配置時使用此憑據: <identity impersonate="true" userName="user" password="pwd" /> 如果為 false,ASP.NET 將使用目前與當前請求的作業系統線程關聯的憑據來串連工作階段狀態儲存區。對於用戶端類比,ASP.NET 將使用與瀏覽器協商的安全憑據來串連工作階段狀態儲存區。如果為 false,ASP.NET 在串連工作階段狀態儲存區時不會恢複為進程標識或應用程式類比標識。有關更多資訊,請參見 ASP.NET 類比。 此屬性是 .NET Framework 2.0 版中的新屬性。 預設值為 true。
注意 |
在 .NET Framework 1.1 版中,如果 mode 屬性設定為 SQLServer,並且用戶端類比有效,則 ASP.NET 使用來自 ASP.NET 用戶端類比的用戶端憑據串連到運行 SQL Server 的電腦。 |
|
繼承的屬性 |
可選的屬性。 由所有節元素繼承的屬性。 |
作者:xinhaijulan
出處:http://xinhaijulan.cnblogs.com
本文著作權歸作者和部落格園共有,歡迎轉載,但未經作者同意必須保留此段聲明,且在文章頁面明顯位置給出原文串連,否則保留追究法律責任的權利。