2011-10-26 45 views
2

我一直在閱讀有關C#/ ASP應用程序的web.config的某些部分的加密和解密,並且我成功地爲我的應用程序加密了web.config的連接字符串。我的問題是解密。我使用標準代碼進行加密和解密,但它修改了web.config。本地它工作正常,因爲當它修改web.config我可以保存它,它仍然會運行,但是當我上傳到遠程服務器,然後它不起作用。Decrypting ConnectionString

我得到的錯誤是

配置錯誤說明:該請求提供服務所需的配置文件的 處理過程中發生錯誤。 請查看下面的具體錯誤細節,並適當修改您的 配置文件。

解析器錯誤消息:使用提供者 'RsaProtectedConfigurationProvider'解密失敗。 壞數據

加密

try 
{ 
    Configuration config = WebConfigurationManager.OpenWebConfiguration("~"); 
    ConfigurationSection section = config.GetSection("connectionStrings"); 
    if (!section.SectionInformation.IsProtected) 
    { 
     section.SectionInformation.ProtectSection("RSAProtectedConfigurationProvider"); 
     config.Save(); 
    } 
    catch (Exception ex) 
    { 

    } 

解密

Configuration config = WebConfigurationManager.OpenWebConfiguration(Request.ApplicationPath); 
ConfigurationSection section = config.GetSection("connectionStrings"); 
if (section.SectionInformation.IsProtected) 
{ 
    section.SectionInformation.UnprotectSection(); 
    config.Save(); 
} 

我所說的解密方法,只要在頁面加載,但它不工作,它給了我:從提供錯誤信息上面的錯誤。

我根本沒有訪問主機服務器的權限。所以使用命令行不是一個選項。

+1

只是好奇,爲什麼你需要手動解密應用程序中的連接字符串?只要訪問'WebConfigurationManager.ConnectionStrings',將會爲你解密配置文件,如果它被加密的話。 – csm8118

+0

這只是交給我的設計。我正在修改代碼來做到這一點。我將C#代碼中的Connectionstring分配給ASP SQLDataSource。 – ReiRei

+0

我試圖在後面的代碼中分配這個,但仍然出現錯誤。爲了測試目的,我在page_load期間爲其中一個asp頁面放置了代碼。 – ReiRei

回答

1

確保在本地的遠程服務器上有相同的解密密鑰。這將是machine key element

+0

我想但我沒有訪問該遠程服務器。圍繞它或任何其他方式,我可以加密連接字符串,不涉及將文件導入到服務器? – ReiRei

+0

您只需要在遠程web.config中添加machineKey設置即可。你有權訪問 - 對嗎?如果不是 - 你無法修復它。 – SliverNinja

+0

我有權訪問該文件,現在我正在添加machinekey代碼,我將對其進行測試。 4GuysGonnaRolla沒有提到,當我正在閱讀他們的文章。 =/ – ReiRei

1

您可以create and export an RSA Key Container但您仍然需要訪問遠程服務器才能導入容器。

我不認爲machineKey元素在這裏是相關的BTW。從MSDN:

與本地機器範圍的密鑰容器(useMachineContainer 「真」),在存儲在一個隱藏文件夾%ALLUSERSPROFILE%\應用數據\微軟\加密\ RSA \ MachineKeys的

0

我m猜測這個場景是你在將它推送到你的主機提供商/遠程服務器之前在本地加密web.config。 Steve Rowbotham在這個問題上的回答是正確的,因爲在開發計算機和遠程服務器上都需要相同的RSA密鑰容器才能在本地進行加密和遠程解密。

作爲部署過程的一部分,你可以採取不同的路由並加密web.config嗎?我們使用MsDeploy來處理在部署過程中對配置文件的加密,如果您願意,我可以提供一些示例代碼。或者,當應用程序第一次加載時(在global.asax中的Application_Start事件期間),您可以檢查web.config的connectionStrings部分是否已加密,然後對其進行加密。你不應該手動解密web.config ...

+0

我不知道如何使用MsDeploy。儘管如果它與遠程服務器有任何關係,它幾乎不可能修改任何東西。僅需繁文to節申請此類更改將比應用程序的分配時間多。 – ReiRei

+0

那麼基本上改變遠程服務器上的任何東西都不在圖片中了嗎?我會嘗試加密Application_Start事件中的connectionStrings,正如我上面提到的那樣。這樣,您的應用就可以完成加密,而且除此之外您不需要其他任何東西。 – csm8118