我正在使用 Visual Studio 2013(.NET 4.5)和 Oracle Developer Tools 最新版本开发MDI应用程序。我需要创建一个主窗体,然后它将成为许多不同形式的容器,每个窗体都是不同的应用程序。
应用程序必须连接到不同的Oracle数据库,现在我尝试设置主窗体以保持所有连接字符串的加密,并且可能在单独的文件上。现在连接字符串只有一个。
要加密连接字符串,我已经使用了这些文章中描述的aspnet_regiis
方法:
总结一下:
我在app.config中添加了<configProtectedData>
部分,我在其中定义了自己的RSA提供程序和密钥容器,因为我需要在多台计算机上导出和导入密钥。然后我创建了密钥容器,并将其与aspnet_regiis
工具一起使用来加密<connectionStrings>
部分。
我还将<oracle.manageddataaccess.client>
变量的TNS_ADMIN
部分设置为使用我自己的 Oracle Instant Client 和我的自定义tnsnames.ora
文件。这将有助于避免不同的机器操作系统和Oracle客户端版本和配置出现问题。
所以,现在我的最终 app.config 文件应该是:
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
<configSections>
</configSections>
<oracle.manageddataaccess.client>
<version number="*">
<settings>
<setting name="TNS_ADMIN" value="D:\VSProjects\Visual Studio 2013\Projects\MDITest\MDITest\"/>
</settings>
</version>
</oracle.manageddataaccess.client>
<configProtectedData>
<providers>
<add name="OracleDeveloperRSAProtectedConfigurationProvider"
type="System.Configuration.RsaProtectedConfigurationProvider,System.Configuration, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a"
keyContainerName="OracleDeveloperDbKeys"
description="Uses RsaCryptoServiceProvider to encrypt and decrypt" />
</providers>
</configProtectedData>
<connectionStrings configProtectionProvider="OracleDeveloperRSAProtectedConfigurationProvider">
<EncryptedData Type="http://www.w3.org/2001/04/xmlenc#Element"
xmlns="http://www.w3.org/2001/04/xmlenc#">
<EncryptionMethod Algorithm="http://www.w3.org/2001/04/xmlenc#tripledes-cbc" />
<KeyInfo xmlns="http://www.w3.org/2000/09/xmldsig#">
<EncryptedKey xmlns="http://www.w3.org/2001/04/xmlenc#">
<EncryptionMethod Algorithm="http://www.w3.org/2001/04/xmlenc#rsa-1_5" />
<KeyInfo xmlns="http://www.w3.org/2000/09/xmldsig#">
<KeyName>Rsa Key</KeyName>
</KeyInfo>
<CipherData>
<CipherValue>ZuB8jsXnXR/6Ww47R4Oc/ksSgHsrRuuOkNypbsdfm1ASDlvdsklsgfhtrwaADFHrywswvfhgnjlsGHSDJKFEROvfsd/TV+LKlysPkccEXmJFCcFZ7S9geSInPBaNvYGweR9FcTK1HVcrYMaddgfBK6lpSTTw6cdMRIOcw0Ib//oYPr34=</CipherValue>
</CipherData>
</EncryptedKey>
</KeyInfo>
<CipherData>
<CipherValue>01old8NrGlRAOLdfdtXUKYuBkZPY5XbWMI/j22Hnm8U=</CipherValue>
</CipherData>
</EncryptedData>
</connectionStrings>
<startup>
<supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.5" />
</startup>
</configuration>
现在我需要使用数据源配置向导来设置Oracle数据集,然后能够将表从DataSource Explorer拖放到自动创建导航按钮并保持表之间关系等的表单。
但是当我在原始app.config
的新应用程序上使用向导完成配置时,它要求我创建一个ConnectionString并将其存储在app.config
内,然后副本也放在里面Settings.settings
文件,显然是纯文本。
如果我执行上述过程来加密原始<connectionStrings>
中的app.config
部分,则DataSet.xsd
仅在 ConnectionString
时才有效设置位于 Settings.settings
内。它没有使用app.config
参数。
我尝试打开DataSet.Designer.cs
文件但是为每个Connection
对象指定了ConnectionString
和TableAdapter
个参数,因为那里有很多表格在我的数据集中,我想避免使用查找/替换方法...另外因为如果我需要对数据集进行一些更改,那么DataSet.xsd
文件可能会被覆盖,因此所有编辑将失去。
我想知道哪种替换连接字符串的最佳方法是使用加密字符串。
最后,我还想知道我是否可以在保留加密的同时将<connectionStrings>
部分移动到另一个.config文件。
- 编辑 -
我已经做了一些更多的测试来重新创建一个新的应用程序项目,而Visual Studio似乎比我想象的更聪明!
在使用向导设置新数据源后,我将第一个连接字符串添加到空白app.config
。然后我修改了app.config
并将<connectionStrings>
部分移到了新的connections.config
文件中。我应用aspnet_regiis
方法来加密该部分,一切正常。但是,因为我仍然可以在Settings.settings
内部以纯文本形式看到连接字符串,所以我决定更改<CipherData>
字符串以查看应用程序是否会抛出错误,或者它是否可以正常工作。很简单,如果应用程序抛出错误,那么它使用加密的连接字符串(我想要的 - 正确),否则它使用Settings.settings
上的纯文本连接字符串(我不知道&#39} ;想要 - 不正确)。令人惊讶的是,该应用程序抛出异常!
Settings.settings
面板似乎总是显示纯文本连接字符串,因为它读取了app.config(以及所谓的connections.config),然后在运行中应用&#34;&#34;解密。 因此,可以将该面板视为app.config的简单视图,该视图显示一些参数,即使它们已加密。
除此之外,我再次使用向导添加了另一个带有另一个连接的数据源。新连接已自动添加到connections.config
加密!我注意到了,因为<CipherData>
字符串已更改。此外,Settings.settings
内的纯文本也可以看到新连接。所以我通过更改字符串重新执行与之前相同的测试,并且应用程序再次抛出错误。
所以,最后,每次添加新连接时都不需要重新加密app.config文件,因为它是自动完成的!太棒了!