我想在運行時動態地在代碼中調整機器密鑰,用於IIS託管的ASP.NET MVC 4網站。代碼中的ASP.NET機器密鑰設置密鑰
機器密鑰,加密和驗證密鑰以及要使用的算法存儲在數據庫中。我不想從web.config
文件中讀取值,而是想在應用程序啓動過程中注入這些值,並讓系統使用這些值。
有什麼辦法可以完成,而不必改變web.config
(只改變內存配置)?
我試過訪問配置部分,但它被標記爲只讀,並且也被密封,所以我不能覆蓋IsReadOnly()
。但是,對我而言,有一個setter
這是一個指示器,可能有辦法刪除只讀標誌。
var configSection = (MachineKeySection)ConfigurationManager.GetSection("system.web/machineKey");
if (!configSection.IsReadOnly())
{
configSection.ValidationKey = _platformInfo.MachineKey.ValidationKey;
configSection.DecryptionKey = _platformInfo.MachineKey.EncryptionKey;
...
}
有沒有什麼辦法可以做到這一點? 我能看到的唯一選擇是使用像AppHarbor這樣的自定義方法,但是如果可能的話,我寧願堅持內置方法。
如果有人問我爲什麼要這樣做,原因是, 這是針對大量相同的網站在網站羣中運行。因此,具有非自動生成的密鑰是必須的(每個服務器上必須是相同的)。每個網站也應該被隔離,不應該共享相同的密鑰。由於所有網站的物理表示都相同,因此它們共享相同的物理位置。這就是web.config文件不能包含應用程序特定設置的原因。
編輯:如果確實無法完成,至少應該確認一下。如上所述,人們可以使用自定義身份驗證和加密方法來避免完全使用機器密鑰設置。謝謝。
感謝了很多,幫助我(和希望其他人也是如此)。通常較大的網站使用單獨的應用程序池。但較小的網站可能共享應用程序池。但正是我所需要的,因爲我可以圍繞這個建立起來。 – michael81
定製CLR配置文件的結構應該是「/configuration/system.web/machineKey」嗎?有沒有辦法顯示或測試應用程序上的實際machineKey值,以確認自定義CLR配置文件實際上是否正確生效? – John
是的。您可以使用ConfigurationManager.GetSection(「system.web/machineKey」),將返回的對象轉換爲MachineKeySection,並查看掛起的屬性以驗證您的更改是否正確拾取。 – Levi