在作一些應用網站時,咱們可能會碰到這樣一種狀況:整個項目是由多個網站組成的,而咱們要實現用戶從一個站點登陸後,跳轉到其餘網站不須要重複登陸,即實現單點登陸。目前實現單點登陸的技術也有好幾種,這篇文章描述一下如何使用ASP.NET2.0和SQL Server來實現單點登陸。通常在用戶登陸成功後,咱們須要把用戶登陸成功的信息保存在Session裏,可是Session的值只能保存在用戶當前訪問的站點下,只要咱們實現了Session的跨站共享,也就基本上實現了用戶在一個站點登陸成功後在其餘站點不須要重複登陸,在這裏,咱們使用SQL Server來保存Session狀態,實現多個站點共享Session。html
開發環境:WindowsXP、VS200五、.NET Framework 2.0、SQL Server 2000web
首先咱們須要建立一個單獨的數據庫來保存Session狀態,安裝了Framework2.0後,咱們能夠在「C:/WINDOWS/Microsoft.NET/Framework/v2.0.50727」目錄下找到一個「InstallPersistSqlState.sql」的SQL文件,這個文件就是用來建立保存Session狀態的數據庫,只須要在查詢分析器中執行一下就能夠了,固然也能夠使用「UninstallPersistSqlState.sql」這個文件來卸載已建立的狀態數據庫。sql
「InstallPersistSqlState.sql」執行完畢後,刷新一下對象瀏覽器,咱們就能夠看到一個叫作「ASPState」的數據庫,數據庫中有兩個表,「ASPStateTempApplications」是用來存儲全部使用SQLServer保存狀態的站點的,「ASPStateTempSessions」固然就是用來保存全部Session的了。以下圖:數據庫
建立完數據庫後,咱們能夠新建一個測試網站,來看一下Session狀態是否能夠保存到數據庫中,固然測試以前咱們還須要對web.config文件作一些設置。打開web.config,在<system.web>標籤下建立<sessionState>標籤,mode屬性是說明把Session狀態保存在什麼地方,有狀態服務器、內存、數據庫等,這裏咱們要選擇SQLServer。設置以下所示:瀏覽器
在測試Session狀態時,有一點須要注意,就是若是咱們在程序中沒有給Session任何值,Session狀態是不向數據庫中保存的。咱們隨便給Session一個鍵值,運行後,使用查詢分析器來看一下「ASPState」數據庫中兩個表的內容,以下:服務器
ASPStateTempApplications表session
ASPStateTempSessions表app
下圖爲測試頁上顯示的Session內容:測試
在這裏咱們須要解釋一下AppID和SessionID,先看一下下面兩張圖中的SessionID,表ASPStateTempSessions中的SessionID比頁面上多出了8位,就是後面的「64021378」,這段字符串實際上是表ASPStateTempApplications裏的AppID的十六進制表示,能夠看出數據庫中SessionID的值,是「頁面SessionID+AppID」組合而成的。網站
既然咱們要實現的是跨站共享Session,那麼咱們須要建立另一個測試站點2,也按照上述方法把Session狀態保存到數據庫中,下圖顯示了在瀏覽器中訪問這兩個站點後,「ASPStateTempSessions」表保存的Session信息:
這兩條SessionID前面的部分相同,不一樣的地方是後面8位標識AppID的值不一樣,在ASPState庫中,判斷是否爲同一用戶是根據SessionID爲條件的,雖然這裏用戶是同一人,但訪問的站點不一樣,SessionID也就不相同了。下面咱們要作的就是忽略SessionID裏面的站點標識,這樣就ASPState就能夠把來自同一用戶的多個站點訪問當作是同一站點訪問,Session值也就能夠在多個站點共享了。
在ASPState庫裏,咱們須要修改「TempGetAppID」這個存儲過程,把裏面兩句「WHERE AppName = @appName」註釋掉就能夠了。在這裏,應注意修改完存儲過程後,須要把ASP.NET網站程序從新啓動一下。
好了,如今咱們能夠測試一下了,在一個站點中給Session賦個值,而後在另外一個站點中取一下,是否是能夠取出來呢,若是能夠,那麼恭喜你,你已經實現了Session共享,應用到你的系統中吧。