有朋友詢問它透過 System.Web.Security.MachineKey.Protect 再將 Byte Array 轉成 Base64 字串後,
在同一台電腦上,透過 Console 程式去解,卻發生 System.Security.Cryptography.CryptographicException 的錯誤。
發生 System.Security.Cryptography.CryptographicException
HResult=0x80131430
Message=進行密碼編譯作業期間發生錯誤。
Source=System.Web
StackTrace:
於 System.Web.Security.Cryptography.HomogenizingCryptoServiceWrapper.HomogenizeErrors ...
朋友是在 C:\Windows\Microsoft.NET\Framework64\v4.0.30319\Config\machine.config 中設定 MachineKey。
<system.web>
<machineKey
validationKey="....."
decryptionKey="...."
validation="SHA1"
decryption="AES"
/>
</system.web>
在 IIS 中可以看到 machine.config 中設定的 validationKey 及 decryptionKey
如果在 web.config 及 app.config 中設定相同的 MachineKey 卻又可以正常的解開。
這樣似乎是因為讀到不同的 machineKey 。
所以我們可以透過 ConfigurationManager.OpenMachineConfiguration 來取得 machine.config 的路徑,
結果可以發現,Console 程式讀取的路徑是 C:\Windows\Microsoft.NET\Framework\v4.0.30319\Config\machine.config ,如下,
所以謎題解開了,就差在讀到不同的 config 檔案。
所以最方便的就是都在各自的 config 檔中設定。
如果要設定在 system level 的話,要確定是否讀到一致的 config 檔哦!
例如 x64 os 的 iis 會讀 C:\Windows\Microsoft.NET\Framework64 目錄,而 Any CPU 的 Console 程式是讀 C:\Windows\Microsoft.NET\Framework 目錄。
可以透過 ConfigurationManager.OpenMachineConfiguration 來確認哦!
小心 C:\Windows\Microsoft.NET\Framework VS C:\Windows\Microsoft.NET\Framework64
Hi,
亂馬客Blog已移到了 「亂馬客 : Re:從零開始的軟體開發生活」
請大家繼續支持 ^_^