App.config 连接字符串保护错误
Posted
技术标签:
【中文标题】App.config 连接字符串保护错误【英文标题】:App.config connection string Protection error 【发布时间】:2010-09-07 17:06:34 【问题描述】:我遇到了以前遇到的问题;找不到关于如何解决它的参考。
这就是问题所在。我们使用以下代码为我们的客户端应用程序加密 app.config 中的连接字符串部分:
config = ConfigurationManager.OpenExeConfiguration(ConfigurationUserLevel.None)
If config.ConnectionStrings.SectionInformation.IsProtected = False Then
config.ConnectionStrings.SectionInformation.ProtectSection(Nothing)
' We must save the changes to the configuration file.'
config.Save(ConfigurationSaveMode.Modified, True)
End If
问题是我们有一个销售人员离开了。旧笔记本电脑要交给新的销售人员,并且在新用户的登录下,当它尝试这样做时,我们会收到错误消息。错误是:
Unhandled Exception: System.Configuration.ConfigurationErrorsException:
An error occurred executing the configuration section handler for connectionStrings. ---> System.Configuration.ConfigurationErrorsException: Failed to encrypt the section 'connectionStrings' using provider 'RsaProtectedConfigurationProvider'.
Error message from the provider: Object already exists.
---> System.Security.Cryptography.CryptographicException: Object already exists
【问题讨论】:
如果您使用的是 Vista 或更高版本,请确保您以管理员身份运行。 【参考方案1】:http://blogs.msdn.com/mosharaf/archive/2005/11/17/protectedConfiguration.aspx#1657603
复制粘贴 :D
2007 年 2 月 12 日星期一上午 12:15,Naica
re:使用受保护的配置加密配置文件
这是我为在我的 PC 上加密两个部分然后将其部署到 WebServer 所做的所有步骤的列表。也许它会帮助某人......:
创建机器级 RSA 密钥容器
aspnet_regiis -pc "DataProtectionConfigurationProviderKeys" -exp
将此添加到 web.config 之前的 connectionStrings 部分:
<add name="DataProtectionConfigurationProvider"
type="System.Configuration.RsaProtectedConfigurationProvider, System.Configuration, Version=2.0.0.0,
Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a,
processorArchitecture=MSIL"
keyContainerName="DataProtectionConfigurationProviderKeys"
useMachineContainer="true" />
不要错过上面的<clear />
!玩多次加密/解密时很重要
选中此选项以在 Web.Config 文件的顶部。如果缺少,请添加:
<configuration xmlns="http://schemas.microsoft.com/.NetConfiguration/v2.0">
在 VS 中保存并关闭 Web.Config 文件(非常重要!)
在命令提示符(我的本地 PC)窗口中转到:
C:\WINNT\Microsoft.NET\Framework\v2.0.50727
加密:(注意更改您的应用程序的物理路径,或使用 -app 选项并为应用程序指定名称 o 虚拟目录!因为我在我的 PC 上使用了 VS,所以我更喜欢下面的选项。路径是Web.config 文件)
aspnet_regiis -pef "connectionStrings" "c:\Bla\Bla\Bla" -prov "DataProtectionConfigurationProvider"
aspnet_regiis -pef "system.web/membership" "c:\Bla\Bla\Bla" -prov "DataProtectionConfigurationProvider"
解密(仅在需要时!):
aspnet_regiis -pdf "connectionStrings" "c:\Bla\Bla\Bla"
aspnet_regiis -pdf "system.web/membership" "c:\Bla\Bla\Bla"
删除密钥容器(仅在需要时!)
aspnet_regiis -pz "DataProtectionConfigurationProviderKeys"
将上述密钥保存到 xml 文件,以便将其从本地 PC 导出到 WebServer(UAT 或生产)
aspnet_regiis -px "DataProtectionConfigurationProviderKeys" \temp\mykeyfile.xml -pri
在 WebServer 服务器上导入密钥容器:
aspnet_regiis -pi "DataProtectionConfigurationProviderKeys" \temp\mykeyfile.xml
授予对 Web 服务器上密钥的访问权限
aspnet_regiis -pa "DataProtectionConfigurationProviderKeys" "DOMAIN\User"
在 IIS 中查看 ASP.NET 用户或使用:
Response.Write(System.Security.Principal.WindowsIdentity.GetCurrent().Name
删除授予对 Web 服务器上密钥的访问权限(仅在需要时!)
aspnet_regiis -pr "DataProtectionConfigurationProviderKeys" "Domain\User"
将加密的 Web.config 文件复制并粘贴到 WebServer。
【讨论】:
【参考方案2】:我在最初对自己的回答中找到了一个更优雅的解决方案。我发现如果我刚刚以最初安装应用程序的用户身份登录并导致配置文件连接字符串被加密并在 commadn 提示符下转到 .net 框架目录并运行
aspnet_regiis -pa "NetFrameworkConfigurationKey" "domain\user"
它授予其他用户访问 RSA 加密密钥容器的权限,然后它适用于其他用户。
只是想在这里添加它,因为我以为我已经在我们的开发博客上写了这个问题,但在这里找到了它,所以如果我需要再次查找它,它会在这里。还将在此线程中添加指向我们开发博客点的链接。
【讨论】:
这也有助于从 ASP .NET 应用程序中获取该错误。 aspnet_Regiis -pa "NetFrameworkConfigurationKey ASPNET 谢谢【参考方案3】:所以我确实让它工作了。
-
从笔记本电脑中删除了旧用户帐户
重置 app.config 以使部分不受保护
从所有用户机器密钥中删除了密钥文件
运行应用程序并允许它保护该部分
但这一切只是让它为这个用户工作。
现在我需要知道如何更改代码以保护该部分,以便 PC 上的多个用户可以使用该应用程序。 Virtual PC 我来了(在明天到下周三的 WDW 假期之后)!
任何可以帮助我指明正确方向的建议,因为我对这种 RSA 加密类型的东西不是很有经验。
【讨论】:
【参考方案4】:听起来像是权限问题。有问题的(新)用户对 app.config 文件具有写入权限?以前的用户是可以掩盖此问题的本地管理员或高级用户吗?
【讨论】:
我们已经为新用户安装了应用程序,使用 clickonce 安装。两个用户都在 pc 上的 admin 组中。从我在网上找到的内容看来,默认 RSA 密钥是特定于机器的,当不同的用户使用它来保护他们的 app.config 版本时,它会导致错误。我想我需要使用一些用户特定的密钥来保护,现在只需要找出方法。 :) 感谢回复!迈克以上是关于App.config 连接字符串保护错误的主要内容,如果未能解决你的问题,请参考以下文章
C# ConfigurationManager 从 app.config 检索错误的连接字符串
在 app.config 中部署通过 RSAProtectedConfigurationProvider 加密的连接字符串