无法使用app.config

时间:2016-09-21 05:48:13

标签: c# winforms entity-framework encryption app-config

我使用以下方法加密connectionstrings项目中app.config的{​​{1}}部分(我在项目中使用Code First EF):

WinForms

我也使用以下方法解密public static void EncryptConfig(string exeConfigName) { var config = ConfigurationManager.OpenExeConfiguration(exeConfigName); var section = config.GetSection("connectionStrings") as ConnectionStringsSection; if (section != null || !section.SectionInformation.IsProtected) { section.SectionInformation.ProtectSection("DataProtectionConfigurationProvider"); config.Save(); } } 部分:

connectionstrings

此方法适用于我的计算机,但当我将应用程序部署到另一台计算机时,我遇到以下异常:

  

System.Configuration.ConfigurationErrorsException:无法使用提供程序'DataProtectionConfigurationProvider'解密。来自提供程序的错误消息:密钥无法在指定状态下使用。 (来自HRESULT的异常:0x8009000B)(D:\ l4test \ Level4UI.exe.config第82行)---> System.Runtime.InteropServices.COMException:密钥无法在指定状态下使用。 (HRESULT异常:0x8009000B)

     

at System.Runtime.InteropServices.Marshal.ThrowExceptionForHRInternal(Int32 errorCode,IntPtr errorInfo)

     

at System.Runtime.InteropServices.Marshal.ThrowExceptionForHR(Int32 errorCode)

     

at System.Configuration.DpapiProtectedConfigurationProvider.DecryptText(String encText)

     

在System.Configuration.DpapiProtectedConfigurationProvider.Decrypt(XmlNode encryptedNode)

     

在System.Configuration.ProtectedConfigurationSection.DecryptSection(String encryptedXml,ProtectedConfigurationProvider provider)

     

at System.Configuration.Internal.InternalConfigHost.System.Configuration.Internal.IInternalConfigHost.DecryptSection(String encryptedXml,ProtectedConfigurationProvider protectionProvider,ProtectedConfigurationSection protectedConfigSection)

     

在System.Configuration.Internal.DelegatingConfigHost.DecryptSection(String encryptedXml,ProtectedConfigurationProvider protectionProvider,ProtectedConfigurationSection protectedConfigSection)

     

在System.Configuration.Internal.DelegatingConfigHost.DecryptSection(String encryptedXml,ProtectedConfigurationProvider protectionProvider,ProtectedConfigurationSection protectedConfigSection)

     

在System.Configuration.BaseConfigurationRecord.CallHostDecryptSection(String encryptedXml,ProtectedConfigurationProvider protectionProvider,ProtectedConfigurationSection protectedConfig)

     

在System.Configuration.BaseConfigurationRecord.DecryptConfigSection(ConfigXmlReader reader,ProtectedConfigurationProvider protectionProvider)

     

---内部异常堆栈跟踪结束---

     

at System.Configuration.BaseConfigurationRecord.EvaluateOne(String [] keys,SectionInput input,Boolean isTrusted,FactoryRecord factoryRecord,SectionRecord sectionRecord,Object parentResult)

     

at System.Configuration.BaseConfigurationRecord.Evaluate(FactoryRecord factoryRecord,SectionRecord sectionRecord,Object parentResult,Boolean getLkg,Boolean getRuntimeObject,Object& result,Object& resultRuntimeObject)

     

at System.Configuration.BaseConfigurationRecord.GetSectionRecursive(String configKey,Boolean getLkg,Boolean checkPermission,Boolean getRuntimeObject,Boolean requestIsHere,Object& result,Object& resultRuntimeObject)

     

在System.Configuration.Configuration.GetSection(String sectionName)

     

at IASCo.Infrastructure.Common.Utilities.Configuration.ConfigurationEncryption.DecryptConfig(string exeConfigName)

this thread中,Jeremy说:

  

您需要使用已解密的部分进行发布。用于加密/解密的密钥是特定于机器的。

我的应用程序将安装在网络共享上并从那里运行但是可能有多个人可以从他们的工作站访问该应用程序,如何指定单个密钥来解密public static void DecryptConfig(string exeConfigName) { var config = ConfigurationManager.OpenExeConfiguration(exeConfigName); var section = config.GetSection("connectionStrings") as ConnectionStringsSection; if (section != null && section.SectionInformation.IsProtected) section.SectionInformation.UnprotectSection(); } 部分这将适用于用于访问应用程序的所有计算机。

我正在寻找一种方法来完成这项工作(在我的机器中加密并在用户的机器中解密)使用c#。

1 个答案:

答案 0 :(得分:0)

您的代码对我来说很合适 - 除了需要从

的用户进行更改
 if (section != null || !section.SectionInformation.IsProtected)
{
   section.SectionInformation.ProtectSection("DataProtectionConfigurationProvider");
   config.Save();
}

 if (section != null || !section.SectionInformation.IsProtected)
    {
       section.SectionInformation.ProtectSection("RsaProtectionConfigurationProvider");
       config.Save();
    }

创建RSA密钥时,请确保使用-exp开关根据文档启用密钥导出:https://msdn.microsoft.com/en-us/library/yxw286t2.aspx

aspnet_regiis -pc "KeysetName"–exp

如前面的回答者所述。除此之外,如果应用程序的用户位于IIS网络上,则可以对组织访问控制列表(ACL)使用ASP.NET模拟。这样您就无需在机器级别进行身份验证,这不适合所有应用程序。请参阅:https://msdn.microsoft.com/en-us/library/xh507fc5.aspx