2012-02-14 83 views
5

我試圖跨多個服務器和子域設置表單身份驗證。我已經成立了像這樣每個應用程序的靜態機鍵:在多個服務器和子域上設置持久表單身份驗證

<system.web> 
    <machineKey validationKey="574...7A7" 
       decryptionKey="2C3...A0D" 
       validation="HMACSHA256" 
       decryption="AES" /> 
</system.web> 

...和我的窗體身份驗證配置爲每個應用程序相同的:

<forms loginUrl="/login" timeout="2880" defaultUrl="/" path="/" name=".SHAREDAUTH" domain="domain.com" protection="All" /> 

我也試過前綴我的域名有一段時間,正如我見過一些人提出的那樣,但那也沒有效果。

這對我的本地機器正常工作,在IIS中爲每個子域設置單獨的網站。它也適用於我們的開發服務器,即所有站點仍駐留在單臺計算機上。但是,當我部署到臨時環境時,跨域身份驗證停止工作。在那個環境中,我有一臺運行在單臺服務器上的主站點(登錄發生處),以及兩臺負載平衡服務器上運行的輔助站點(我的身份驗證應持續存在)。所有都在Windows 7(本地)或Server 2008 R2(開發和分期)的IIS 7下運行。

我驗證了機器密鑰是相同的通過編碼在主站點上的字符串與MachineKey.Encode並用MachineKey.Decode.輔助服務器我也驗證了.SHAREDAUTH cookie被傳遞到請求中的第二應用的結果進行解碼,通過檢查Firefox和Chrome報告的請求標頭,並將調試器掛接到Application_BeginRequestApplication_AuthenticateRequest.,我可以在Application_BeginRequest執行期間看到cookie,但在調用Application_AuthenticateRequest時它不見了。從我可以收集的信息來看,這似乎意味着身份驗證票證的反序列化失敗了,但我無法弄清楚爲什麼會出現在多服務器環境中,而不是單個服務器環境,除了不同的機器密鑰,我已經證實並非如此。

我也有一個自定義MembershipProvider和RoleProvider設置,並且這些工作在每個站點上獨立運行。

我錯過了什麼?

+0

請不要在「ASP.Net C# - 」等前加字幕。這就是標籤的用途。 – 2012-02-14 20:06:49

+0

對於那些有同樣問題的人,我在這篇文章中做了一些提示:http://stackoverflow.com/questions/8361323/net-2-0-web-app-authentication-failing-the-ticket-supplied-是無效的問候 – user1482638 2012-06-26 12:07:35

回答

3

因此,經過長時間的發現,我發現MS security bulletin MS11-100,它修復了表單身份驗證中的特權提升漏洞。不幸的是,該補丁不能向後兼容。它應用於我們的負載平衡服務器,但不適用於託管創建初始登錄的應用程序的服務器,這意味着平衡服務器無法反序列化應用服務器編寫的身份驗證票證。

Per the MS deployment guidance article,如果你發現自己在這種情況下,您可以添加

<add key="aspnet:UseLegacyFormsAuthenticationTicketCompatibility" value="true" /> 

在web.config中appSettings節上的補丁安裝了機器的應用程序(或計算機級配置)。或者,更好的是,確保你的託管管理公司適用的補丁到所有在同一時間服務器...

0

對於我來說,工作在AppSettings的添加此鍵:

<add key="aspnet:UseLegacyEncryption" value="true" /> 
    <add key="aspnet:UseLegacyFormsAuthenticationTicketCompatibility" value="true" /> 
相關問題