2012-10-12 103 views
0

我正嘗試在兩個子域名上登錄用戶。.net子域名Cookie

考慮到這些子域:

forum.mydomain.com,account_a.mydomain.com,account_b.mydomain.com。

用戶登錄到account_a.mydomain.com。在我的身份驗證功能中,我想爲forum.mydomain.com創建身份驗證Cookie。 (但不是(!)account_b.mydomain.com)

我試着創建一個cookie,並將.domain屬性設置爲forum.mydomain.com,但不知何故該cookie沒有創建。將.domain屬性設置爲.mydomain.com並不是我想要的,因爲它會產生安全問題,因爲account_a和account_b是兩個完全不同的用戶。

我如何得到它的工作?

回答

1

唯一可以創建特定域cookie的機器是一臺解析您所創建域的機器。如果你想創建一個名爲account_a.mydomain.com的cookie,那麼你的服務器的url必須從該特定的域訪問。鑑於此,account_a.mydomain.com不可能創建特定於forum.mydomain.com的cookie,因爲它們是完全獨立的地址。任何嘗試創建這樣的cookie實際上都會爲account_a.forum.mydomain.com創建一個cookie。

至於如何讓它起作用,你還沒有真正說明你爲什麼要用這種方式修改cookie,所以很難說。您只能爲每個瀏覽器的用戶提供一個有效的身份驗證Cookie,並且這些Cookie對於瀏覽器的所有實例都是通用的,所以實際上無法爲account_b擁有account_a validate的Cookie,並且這兩個Cookie無法反正住在同一臺機器上。域級認證的目的之一是防止這種同時多重性。

編輯:(迴應評論)

在您希望用戶能夠跨前往你不需要觸摸cookie自身的多域服務器的情況。它會自動綁定到mydomain.com域,並允許這樣的遍歷。試圖在全局對象上應用單獨的系統級安全機制只是稍微倒退一點。用一個比喻來說,你不會用鐵絲網在房子周圍劃上柵欄,以使某人遠離地下室。需要在該服務器級別應用認證控制以防止account_a訪問account_b域。我的猜測是,你有某種形式的公共代碼,其中域是合理的認證,所以你真正需要做的是處理實際的授權。

一種方法是將一些自定義代碼添加到頁面基類的Init或Load事件中。另外,您可以在global.asax中的BeginRequest事件中添加一段邏輯。我見過的一種技術(儘管從來沒有用過),是添加到global.asax中的AuthorizeRequest事件。我無法找到任何描述該主題的文檔,但我確實找到了一個可以顯示它如何完成的例子。 https://nport.svn.codeplex.com/svn/jacky/ccs/CCWeb/Global.asax.cs

+0

當來自account_a或account_b的用戶登錄並想要訪問論壇時,我不想讓他再次登錄。他們是我的服務器上的兩個不同的.net應用程序。 – Jeroen

+0

@Jeroen:我的回覆太多了,無法發表評論。我會更新我的答案。 –

+0

我明白了。我將不得不將cookie綁定到.mydomain.com。但這樣我一次只能登錄到1個賬戶。我的一些用戶雖然可以一次登錄到多個帳戶。我可以通過使用cookie的帳戶特定名稱來解決此問題? – Jeroen

2

您無法單獨使用cookie設置解決此問題,域​​屬性的目的是爲了防止這種情況。

如果forum.mydomain.com和account_a.mydomain.com絕對需要使用相同的身份驗證Cookie,則需要將其設置爲.mydomain.com,並有一些邏輯確保它在account_b.mydomain中無效。com