System.Web.Security.MachineKey.Protect & Unprotect 問題

有朋友詢問它透過 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:從零開始的軟體開發生活

請大家繼續支持 ^_^