2012-07-05 88 views
4

我有在同一服務器上運行兩個.NET Web應用程序之間FormsAuthentication - 定點(在https://sentinel.mydomain.com/託管)和fortknox(在http://www.mydomain.com/fortknox「無法驗證數據」使用不同的Web應用程序

是哨兵一個認證'門戶'。 FortKnox是一個'概念驗證'應用程序,它使用表單身份驗證,但將loginUrl設置爲https://sentinel.mydomain.com/login(以及特殊的Application_EndRequest處理程序以限定ReturnUrl)。 Sentinel使用MVC 4和Razor在.NET 4.0中編寫; FortKnox是使用.NET 2.0的ASP.NET MVC 2。

我正在使用ASP.NET FormsAuthentication並將cookie域設置爲.mydomain.com,以便將由sentinel.mydomain.com設置的Cookie發送請求至www.mydomain.com,反之亦然。 Cookie部分工作正常 - 兩個應用程序都獲得相同的.ASPXAUTH加密表單票證。

的問題是,在我們的生產服務器,fortknox不能解密定點創建的cookie - 即使他們有相同的機鍵。即使兩個應用程序都在同一個物理盒子上運行,它也不起作用。

用戶點擊fortknox,他們重定向到定點,他們登錄的Cookie設置,他們重定向回fortknox,然後我得到「無法驗證數據」:

Exception: Unable to validate data. 
    at System.Web.Configuration.MachineKeySection.EncryptOrDecryptData(Boolean fEncrypt, Byte[] buf, Byte[] modifier, Int32 start, Int32 length, IVType ivType, Boolean useValidationSymAlgo, Boolean signData) 
    at System.Web.Configuration.MachineKeySection.EncryptOrDecryptData(Boolean fEncrypt, Byte[] buf, Byte[] modifier, Int32 start, Int32 length, IVType ivType, Boolean useValidationSymAlgo) 
    at System.Web.Security.FormsAuthentication.Decrypt(String encryptedTicket) 
    at FortKnox.Web.MvcApplication.Application_BeginRequest() 

本機鍵是相同的 - 我已經儘可能包括該區塊的每個頁面的加價(討厭!)代碼:

try { 
    var cookie = Request.Cookies[".ASPXAUTH"].Value; 
    Response.Write("Cookie: " + cookie + Environment.NewLine); 
    var ticket = FormsAuthentication.Decrypt(cookie); 
    Response.Write("Ticket name: " + ticket.Name + Environment.NewLine); 
} catch (Exception x) { 
    Response.Write("Exception: " + x.Message + Environment.NewLine); 
    Response.Write(x.StackTrace); 
} 
Response.Write("<hr /></pre>"); 
var machineConfigMachineKey = (MachineKeySection)WebConfigurationManager.OpenMachineConfiguration().SectionGroups["system.web"].Sections["machineKey"]; 
var webConfigMachineKey = (MachineKeySection)WebConfigurationManager.OpenWebConfiguration("").SectionGroups["system.web"].Sections["machineKey"]; 
Response.Write("<pre>"); 
Response.Write("<b>machine.config decrypt: </b>" + machineConfigMachineKey.DecryptionKey + "<br />"); 
Response.Write("<b>web.config decrypt:  </b>" + webConfigMachineKey.DecryptionKey + "<br />"); 
Response.Write("<br />"); 
Response.Write("<b>machine.config validate: </b>" + machineConfigMachineKey.ValidationKey + "<br />"); 
Response.Write("<b>web.config validate:  </b>" + webConfigMachineKey.ValidationKey + "<br />"); 
Response.Write("</pre>"); 
Response.Write("<hr />"); 

,並驗證了在運行時所使用的機器密鑰一模一樣。

特別令人沮喪的是,這一直在我們的開發和登臺服務器上工作,並且只在生產中失敗。服務器之間唯一的區別在於生產環境中經常安裝Windows更新,而我們的開發/升級框可能會缺少一些更新;他們在其他方面是相同的(從相同的圖像克隆,並使用相同的安裝腳本創建)

所以...同樣的服務器;相同的機器密鑰。 ASP.NET 4設置了FormsAuthentication cookie。 ASP.NET 2應用程序無法解密它。僅在某些服務器上發生錯誤;在別人身上,它正在工作。在這一點上,我完全卡住了......有什麼想法?

編輯:Live服務器已被帶到最新的補丁級別。我曾嘗試申請

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

既是真假,雙方在登錄應用程序和應用程序fortknox。仍然沒有運氣...

+0

我有同樣的問題,並且已經嘗試了3個按鍵,但沒有成功,它採用2.0和1.1,目前之間的合作與2.0和1.1的工作,但不能與4.0 – 2013-11-07 13:17:35

回答

1

你嘗試下列所有鍵? http://support.microsoft.com/kb/2425938

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