C# - 使用 aspnet_regiis.exe 时找不到配置节

本文关键字:找不到 配置 exe regiis 使用 aspnet | 更新日期: 2023-09-27 17:56:56

我正在尝试为我正在开发的 C# 应用程序加密 app.config 文件中的敏感连接字符串信息。我正在使用以管理员身份运行的 VS 命令 promt 中的以下命令:

aspnet_regiis.exe -pef "Credentials" "C:'Users'.....'MyProjectFolderDir"

这是我的app.config文件的结构:

<?xml version="1.0" encoding="utf-8" ?>
<config>
    <configSections>
      <section name="ApplicationSettings" type="sometype"/>
      <section name="WebSettings" type="sometype"/>
      <section name="Credentials" type="sometype"/>
      <section name="SQLServerSettings" type="sometype"/>
    </configSections>
    <startup> 
        <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.5.2" />
    </startup>
    <ApplicationSettings   Mode="mymode"
                           FileSearchMode="myfilemode"
                           SubtractHoursDebugging="0"/>
    <WebSettings WebApiServers=""
                    CredentialMethod="mymethod"/>
    <Credentials
                    Domain="mydomain"
                    UserName="myusername"
                    Password="mypassword"/>
    <SQLServerSettings
        ConnectionString="Server=***********"/>
  </config>

但是,我不断收到以下错误:

正在加密配置部分... 找不到配置部分"凭据"。 失败!

我怎样才能让它加密我的部分?

C# - 使用 aspnet_regiis.exe 时找不到配置节

您的配置文件应该以<configuration>元素开头,而不是<config> .因为它<config> aspnet_regiis.exeCredentials嵌套元素,因此错误。对于您当前的配置文件,该命令应该是

aspnet_regiis.exe -pef "config'Credentials" "C:'Users'.....'MyProjectFolderDir"

首先,这里有一个答案,您可以从自定义配置部分了解如何在app.config中创建自定义配置部分? 这是MSDN https://msdn.microsoft.com/en-us/library/2tw134k3.aspx 的示例

其次,类型通常引用真实模型,因此您应该输入命名空间和您创建的类,以对要使用的配置类型进行建模,如下所示:

 <configuration>
 <configSections>
  <section name="sampleSection"
           type="System.Configuration.SingleTagSectionHandler" />
</configSections>
<sampleSection setting1="Value1" setting2="value two" 
              setting3="third value" />
</configuration>

希望对你有帮助

事实证明,aspnet-regiis.exe 专门用于 web.config 文件。它不适用于 app.config 文件,除非您重命名为 web.config。我没有在每次想要加密/解密时重命名我的 app.config,而是最终创建了一个类,每次运行应用程序时都会处理这个问题。确保使用以下方法:

using System.Configuration;
using System.Web.Security;

类:

internal class Crypto
{
    internal static AppSettingsSection GetEncryptedAppSettingsSection(string exeConfigName)
    {
        // Open the configuration file and retrieve 
        // the connectionStrings section.
        System.Configuration.Configuration config = ConfigurationManager.
            OpenExeConfiguration(exeConfigName);
        AppSettingsSection section =
                config.GetSection("appSettings")
                as AppSettingsSection;
        EncryptConfigSection(config, section);
        return section;
    }
    internal static ConnectionStringsSection GetEncryptedConnectionStringsSection(string exeConfigName)
    {
        // Open the configuration file and retrieve 
        // the connectionStrings section.
        System.Configuration.Configuration config = ConfigurationManager.
            OpenExeConfiguration(exeConfigName);
        ConnectionStringsSection section =
                config.GetSection("connectionStrings")
                as ConnectionStringsSection;
        EncryptConfigSection(config, section);
        return section;
    }
    internal static void EncryptConfigSection(System.Configuration.Configuration config, ConfigurationSection section)
    {
        //Ensure config sections are always encrypted
        if (!section.SectionInformation.IsProtected)
        {
            // Encrypt the section.
            section.SectionInformation.ProtectSection("DataProtectionConfigurationProvider");
            // Save the current configuration.
            config.Save();
        }
    }
}