2008-11-07 179 views
12

我有一個應用程序,其中,在使用應用程序的過程中,用戶可能點擊從如何在ASP.NET中的多個子域之間共享會話?

virginia.usa.com 

newyork.usa.com 

因爲我不想每次都創建一個新的會話的用戶從一個子域跨越到另一個子域,在多個子域之間共享會話信息的好方法是什麼?

回答

35

使用ASP.NET和IIS標記這一點,所以我會假設這是你的環境。請確保你有這樣的在你的web.config:

<httpCookies domain=".usa.com"/> 

如果你的子域2映射到相同的應用程序,然後你做。但是,如果它們是不同的應用程序,則需要執行一些額外的工作,例如使用基於SQL Server的會話存儲(並竊聽存儲過程以確保所有應用程序共享相同的會話數據),或使用HttpModule攔截應用程序名稱,因爲即使使用共享的Cookie和相同的機器密鑰,2個應用程序仍然會爲其會話數據使用2個不同的商店。

+0

非常感謝馬特!我們之前使用過[此解決方案](http://stackoverflow.com/a/2174338/177710),但它保持OutputCaching不起作用。您的解決方案使我們的OutputCache最終能夠正常工作:-D – Oliver 2012-01-24 22:41:42

0

如果你使用PHP,一個黑客會稍作包括腳本(或兩個)執行以下操作:

1系列化你$ _SESSION陣列 2字符串作爲一個隱藏的輸入,使用POST將所有鏈接指向單獨表單中的這些按鈕。 3還包括布爾隱藏的輸入,讓你的腳本知道是否需要使用當前會話或反序列化$ _ POST [「會議」] 4部署這個在您的網站,呼籲在適當的事情

我不會如果實際上有轉移會話的認可方式,請執行此操作。我希望你至少考慮過使用cookie。

0

我不認爲不同的子域在他們自己的力量不同的會議。您作爲示例給出的兩個URL都可以指向IIS中的相同應用程序。

這聽起來像是你有不同的服務器或至少IIS中的每個子域的不同網站。存儲這種持久狀態的最佳方式是在中央數據庫中。我發現ASP.NET中的Profile服務對此非常有用。

希望有所幫助。

+0

問題是在瀏覽器中的會話cookie,這是域綁定 – 2009-03-18 15:48:42

3

跟蹤您自己的會話並使用具有適當域名設置的cookie,即。 .usa.com

或者,如果您使用的是PHP,我相信有一個設置可以更改它使用的會話cookie的默認域設置,這可能也很有用。

你要找的設置是:

session.use_cookies = 1 
session.use_only_cookies = 1 
session.cookie_domain = .usa.com 
0

如果你有多個子域指向同一個IIS應用程序(這正是我現在使用通配符DNS,然後在接收端進行子域'嗅探')的情況下,馬特的答案絕對是一種方式。

但是,我想添加一些我曾經遇到的情況,以防有人發現這不適合他們。設置httpCookies線單獨對我沒有做到這一點,我有一個的machineKey條目添加到我的web.config文件:

的machineKey decryptionKey =「12 ...... D1」的validationKey =「D7..8B」

特別奇怪,因爲我是而不是在網絡農場設置中(除非AWS/EC2的實際效果如此)。只要我這樣做,它就像冠軍一樣工作。

3

我最近通過這個,並學會了艱難的道路。本地主機實際上被認爲是頂級域名。 Cookie域至少需要二級域名 - test.com。如果您希望Cookie用於域名及其所有子域名,則前綴爲'。'。 - .test.com。

在本地運行/調試時,設置localhost域會失敗,即使域設置正確,它也會失敗,因爲visual studio默認使用localhost。

可以在項目屬性中更改此默認localhost,以便項目實際上可以在cookie域test.com上運行。實質上,如果瀏覽器中的地址匹配,就可以使其工作。

我的問題記錄在這裏:Setting ServiceStack Cookie Domain in Web.Config Causes Session Id to Change on Every Request

希望這有助於。

相關問題