2015-04-12 115 views
22

我正在運行Azure網站。無論何時我部署,每個人都會因爲machineKey更改而被註銷。如何在Azure網站上設置machineKey

我在web.config中指定了machineKey,但這並未解決問題。我相信這是因爲Azure會自動覆蓋machineKey[1]

我在這裏發現了一些類似的問題,但答案鏈接到死鏈接。

那麼,有什麼解決方案?當然,有一種方法可以讓用戶無論在Azure上進行部署,都可以保持登錄狀態。

+1

以WebRole或通過Azure網站託管的網站? –

+0

一個Azure網站。 –

+0

你確定它沒有使用InProc會話來讓你的用戶註銷嗎?我們使用web.config中指定的machineKey在Azure網站上使用自動縮放進行cookie加密,並且在擴展或新部署時更改機器鍵方面沒有問題。 – jakobandersen

回答

0

如果Azure正在重寫您的machineKey,那麼您無法做太多的工作,因爲它是基礎架構的一部分。但是,還有其他方法。

覆蓋FormsAuthentication

這不應該是困難的,因爲你可以很容易地查找了FormsAuthentication的源代碼,並創建自己的邏輯和存儲在web.config中或在你的數據庫自己的密鑰更換的machineKey。

自定義身份驗證篩選

最簡單的方法是創建一個過濾器,檢查,驗證,加密解密cookies在你的過濾器。您需要在OnAuthorization方法上執行此操作,並創建IPrincipal的新實例,並在解密成功時將IsAuthenticated設置爲true。

的OAuth

  1. 啓用OAuth的創造OAuthProvider。但是,您需要在您的控制檯上的服務器上託管OAuthProvider,因爲這需要machineKey工作。
  2. 啓用第三方OAuth,如果您通過Google,Facebook等啓用OAuth,將很容易,因爲用戶將被重定向到OAuth提供商,他們將繼續自動登錄並建立新會話。
15

試圖將機器按鍵部分配置在Application_Start復位:

protected void Application_Start() 
{ 
    // ... 

    var mksType = typeof(MachineKeySection); 
    var mksSection = ConfigurationManager.GetSection("system.web/machineKey") as MachineKeySection; 
    var resetMethod = mksType.GetMethod("Reset", BindingFlags.NonPublic | BindingFlags.Instance); 

    var newConfig = new MachineKeySection(); 
    newConfig.ApplicationName = mksSection.ApplicationName; 
    newConfig.CompatibilityMode = mksSection.CompatibilityMode; 
    newConfig.DataProtectorType = mksSection.DataProtectorType; 
    newConfig.Validation = mksSection.Validation; 

    newConfig.ValidationKey = ConfigurationManager.AppSettings["MK_ValidationKey"]; 
    newConfig.DecryptionKey = ConfigurationManager.AppSettings["MK_DecryptionKey"]; 
    newConfig.Decryption = ConfigurationManager.AppSettings["MK_Decryption"]; // default: AES 
    newConfig.ValidationAlgorithm = ConfigurationManager.AppSettings["MK_ValidationAlgorithm"]; // default: SHA1 

    resetMethod.Invoke(mksSection, new object[] { newConfig }); 
} 

上述假設您在<appSettings>部分設置適當的值:

<appSettings> 
    <add key="MK_ValidationKey" value="...08EB13BEC0E42B3F0F06B2C319B..." /> 
    <add key="MK_DecryptionKey" value="...BB72FCE34A7B913DFC414E86BB5..." /> 
    <add key="MK_Decryption" value="AES" /> 
    <add key="MK_ValidationAlgorithm" value="SHA1" /> 
</appSettings> 

但你可以加載來自您喜歡的任何配置來源的實際值。

+0

非常感謝@ haim770。我現在正在測試它,它似乎正在工作。 –

+1

@ Mr.Flibble,我也在一個免費的Azure網站上測試過它。但是,由於Azure網站團隊不斷解鎖越來越多的'Web.Config'部分,我相信他們最終會讓您在配置中正常設置MachineKey。 – haim770

+0

真棒執行@ haim770。看來這不是爲我們工作。我們使用.NET 4.6.1並使用OWIN啓動與app.UseCookieAuthentication()並使用Redis緩存會話提供程序。我實現了上述功能,但用戶在插槽交換後不斷註銷。有任何想法嗎? – gorillapower

0

我有同樣的問題,在我的情況下,我在VS13中使用webdeploy到Azure嚮導。我以爲我瘋了,因爲我會在web.config中設置機器密鑰,然後它將在部署的web.config上更改爲自動生成。它在webdeploy腳本/設置中。我的解決方案是使用服務器資源管理器從VS13中打開實時Azure站點,然後編輯web.config並保存更改。這保存我的設置與我提供的鍵和一切正常。