我已按照Microsoft的说明here来加密我的应用程序的连接字符串。我选择将连接字符串移动到他们自己的配置文件connections.config。我的代码如下所示(页面底部) - 几乎与Microsoft提供的代码段完全相同。执行操作后,命令:MessageBox.Show(String.Format("Protected={0}", connectionStringsSection.SectionInformation.IsProtected))
打印True
,表示操作成功。
但是,Microsoft声明“以下配置文件片段在加密后显示connectionStrings部分:”
configProtectionProvider="DataProtectionConfigurationProvider">
<EncryptedData>
<CipherData>
<CipherValue>AQAAANCMnd8BFdERjHoAwE/Cl+sBAAAAH2... </CipherValue>
</CipherData>
</EncryptedData>
在我的情况下,这似乎不正确。尽管在询问我的True
时是否打印sectionInformation.IsProtected
,但在视觉检查时,我的app.config和我的connections.config文件都保持不变。这引出了我的问题:
sectionInformation.IsProtected
打印True
,但我的<EncryptedData>
没有添加sectionInformation
个属性?<connectionStrings configSource="connections.config" />
是否足以确保此行为? IsProtected
属性?注意
我的代码的相关部分发布在下面:
*app.config*
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
<configSections>
<!-- ... -->
</configSections>
<system.diagnostics>
<!-- ... -->
</system.diagnostics>
<userSettings>
<!-- ... -->
</userSettings>
<connectionStrings configSource="connections.config" />
</configuration>
*connections.config*
<connectionStrings>
<!--Manhattan Connection-->
<add name="MANHATTAN"
connectionString="Data Source=xxx;Initial Catalog=xxx;Persist Security Info=False;Integrated Security=False" />
<add name="DENVER"
connectionString="Data Source=xxx;Initial Catalog=xxx;Persist Security Info=False;Integrated Security=False" />
<add name="DESMOINES"
connectionString="Data Source=xxx;Initial Catalog=xxx;Persist Security Info=False;Integrated Security=False" />
</connectionStrings>
*The connection source code*
Private Sub ToggleConfigurationEncryption(ByVal executableName As String)
Try
Dim configManager = ConfigurationManager.OpenExeConfiguration(executableName)
Dim connectionStringsSection = configManager.GetSection("connectionStrings")
If connectionStringsSection.SectionInformation.IsProtected Then
connectionStringsSection.SectionInformation.UnprotectSection()
Else
connectionStringsSection.SectionInformation.ProtectSection("DataProtectionConfigurationProvider")
End If
configManager.Save()
MessageBox.Show(String.Format("Protected={0}", connectionStringsSection.SectionInformation.IsProtected))
Catch ex As Exception
ExceptionController.LogException(ex)
ExceptionController.DisplayException(ex)
End Try
End Sub
答案 0 :(得分:0)
您的问题发生在if
声明中。
If connectionStringsSection.SectionInformation.IsProtected Then
connectionStringsSection.SectionInformation.UnprotectSection()
...
此示例显示如何在加密和解密之间切换。在您发布的代码中,如果文件已经加密,您只需解密该文件即可。你的代码应该是这样的:
If (Not connectionStringsSection.SectionInformation.IsProtected) Then
connectionStringsSection.SectionInformation.ProtectSection("DataProtectionConfigurationProvider")
End If
如果文件尚未加密,您只想加密。不要担心解密文件并尝试阅读。它会自动为您解密。
我没有看到你如何调用ToggleConfigurationEncryption
方法。您需要传递输出配置文件的正确名称。启动应用程序后(如果处于调试模式),您可以转到bin\debug
文件夹中的项目目录并查找connections.config
文件。当您打开它时,您会看到它已加密。