2014-01-08 72 views
2

我需要存儲和檢索本地數據庫中的敏感數據 - 此數據由Web應用程序使用。IIS應用程序上的ProtectedData.Unprotect - 在IISRESET後無法工作

爲了保護上述數據,我選擇使用ProtectedData類。

IIS應用程序正在使用特定AD用戶(高級設置中的標識屬性)運行。直到我做一個IISRESET

一切正常 - 在這一點上,似乎表明了身份改變爲ProtectedData類的目的,我留下了我的數據無法解密 - 我得到一個Key not valid for use in specified state例外。

下面是我使用的代碼:

static public string Encrypt(string data) 
    { 
     var encryptedData = ProtectedData.Protect(System.Text.Encoding.UTF8.GetBytes(data), entropy, DataProtectionScope.CurrentUser); 
     return Convert.ToBase64String(encryptedData); 
    } 

    static public string Decrypt(string base64string) 
    { 
     var encryptedData = Convert.FromBase64String(base64string); 
     return System.Text.Encoding.UTF8.GetString(ProtectedData.Unprotect(encryptedData, entropy, DataProtectionScope.CurrentUser)); 
    } 

entropy是我的應用程序顯然是靜態的。

發生了什麼事?顧名思義,我認爲DataProtectionScope.CurrentUser將使用當前用戶 - 據我所知,這應該是應用程序池標識。爲什麼我在執行IISRESET時看起來會發生變化?

回答

0

雖然我不知道爲什麼會發生這種情況,但我更改了代碼以使用AES加密,而不是 - 這工作正常。

雖然不是每個問題的答案,但我認爲這是一個值得一提的有效解決方法。

編輯

我想我已經找到是什麼原因導致的問題(我還是不知道究竟爲什麼發生這種情況,但我今天沒有通知的東西)。

如果Web應用程序使用的是標識,那麼一切都很好,並且DPAPI應該在IISRESET之後繼續工作。 但是如果我將身份更改爲AD中定義的特定用戶,那麼在應用程序池回收後,事情就會變得不合時宜。

對我來說幸運在這種特殊情況下,我不再需要特定的AD用戶,並且主要加密基於AES(DPAPI不​​能用於在負載平衡進入方程時訪問共享資源)和DPAPI僅用於加密AES密鑰的本地副本。

+0

你曾經以任何方式解決這個問題嗎? – Julien

+0

可悲的是,沒有。如上所述,我確實使用了AES。另一方面,這是一個更好的解決方案,因爲可能會使用未來的負載平衡,在這種情況下,多個Web應用程序將無法訪問受DPAPI保護的共享數據。 – Shaamaan

+0

@Julien我想我找到了真正的原因 - 檢查編輯的答案。 ;) – Shaamaan

0

使用ASP.NET Core Data Protection API時出現確切錯誤,對於出現此錯誤的用戶,請確認爲應用程序池用戶啓用了LoadUserProfile。

相關問題