2012-02-24 83 views
3

購物車應用程序我正在處理跳轉域,當它從正常頁面進入submit-your-details頁面時。如何在c#mvc中跨多個子域保持會話?

長話短說,部署的應用程序有兩個副本:一個用於'主'站點的服務器和一個服務器,用於在客戶詳細信息(包括付款;這是PCI合規性問題)上運行的ev證書。

我的問題是這樣的:

當從http://shop.domain跳 - >https://secure.domain(和回來,如果用戶瀏覽回),我怎麼能保存會話?

它使用JSONP跨域傳遞cookie的微不足道,但我不知道如何處理他們在遠程端「重新連接」會話。

我已經閱讀了有關滾動您自己的自定義會話提供程序等各種事情等,但我沒有找到一個不僅僅是通用的建議;當然並沒有例子說明這可能如何用來重新加入會議。

這是一個MVC3 c#web應用程序。

+0

看看[這個問題](http://stackoverflow.com/questions/273732/how-can-i-share-a-session-across-multiple-subdomains-in-asp-net)但是您將遇到的問題是您必須對同一應用程序進行不同的部署,因此您需要進行大量工作。更可能的是,你必須將它們指向同一個會話數據庫並在它們之間做一些黑魔法。 – shenku 2012-02-24 02:06:07

回答

7

Session的問題在於它們保持在同一個域中。

如果您有子域的2個應用程序可以隨時追加給你的web.config

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

而且會做的伎倆,但如果域是完全不同的,最好的辦法就是始終推出自己的會話提供程序或使用現有的會話提供程序,如SQL。

您可以使用這個任何緩存系統,其中,而不是變量追加到一個會話變量,你追加它們到緩存爲鍵/值對,你可以隨時使用NoSQL的替代(的free accounts很多在那裏這樣您可以進行原型設計並進行概念驗證,以便推出最終的比特)。

Memcached服務器始終是一個很好的選擇和Couchbase作爲community version免費提供。

這裏的技巧是要做到這一點:

Cache.AddObject(key + "UserInfo-name", "Bruno Alexandre"); 

其中key可以在session_start

Session["UserInfo-name"] = "Bruno Alexandre"; 
0

,而不是當您創建的cookie是global.asax附加查詢字符串值那麼你必須寫

Response.AppendCookie("Your cookie name"); 

要獲得該代碼是一樣的東西

if (Request.Cookies["Your cookie name"] != null) 
{ 
    string value = Request.Cookies["Your cookie name"].Value; 
} 

,如果有不同的解決方案,然後找到

的machineKey 這就需要相同。你得到它的下

的System.Web在web.config文件

,然後寫我使用的HttpContext從函數創建用戶會話後的machineKey

<httpCookies domain=".yourdomainname.com" /> 
0

HttpContext cu; 
string username = cu.User.Identity.Name; 
username = Guid.NewGuid().ToString(); 
cu.Session["username"] = username; 
HttpCookie hc = new HttpCookie("username", username); 
hc.Domain = ".yourdomain.com"; 
hc.Expires = DateTime.Now.AddDays(1d); 
cu.Response.Cookies.Add(hc); 

通過此代碼,我可以在3個子域中共享會話。