65.9K
CodeProject 正在变化。 阅读更多。
Home

使用 C# 2.0 编辑和加密 Web.Config 部分

starIconstarIconstarIconstarIcon
emptyStarIcon
starIcon

4.11/5 (24投票s)

2007年5月3日

CPOL

4分钟阅读

viewsIcon

101056

downloadIcon

1111

本文旨在说明如何以编程方式编辑和加密 Web.Config 文件的部分内容。

Screenshot - WebConfigApp.jpg

引言

ASP.NET 1.x 允许 .NET 应用程序从 Web.Config 文件中读取配置。但是,没有以编程方式操作 Web.Config 内容的选项。为了实现这一点,我们必须将 Web.Config 文件视为普通文件或 XML 文件并手动进行操作。.NET 2.0 弥补了这一不足,并提供了许多其他有用的操作,可用于 Web.Config 文件,例如编辑和加密 Web.Config 文件的部分内容。本文通过一个 ASP.NET 应用程序示例说明了这些功能。

使用代码

用于控制 Web.Config 文件的类和方法分布在两个命名空间中

  1. System.Configuration
  2. System.Web.Configuration

Web.Config 文件中的每个部分在其中一个命名空间中都有一个对应的类。这些类允许修改相应的节。位于 "system.web" 部分内的节的类在 System.Web.Configuration 中。不特定于 Web.Config 的其他部分的类在 System.Configuration 中。

修改 Web.Config 中某一部分的步骤

  1. 使用 WebConfigurationManager 类打开 Web.Config 进行编辑。
  2. 使用 respective Configuration 类进行必要的更改。
  3. 使用 Configuration 类将更改保存到物理文件中。
private void UpdateConfig(string strKey, string strValue)
{
    Configuration objConfig = 
        WebConfigurationManager.OpenWebConfiguration("~");
    AppSettingsSection objAppsettings = 
       (AppSettingsSection)objConfig.GetSection("appSettings");
    if (objAppsettings != null)
    {
        objAppsettings.Settings[strKey].Value = strValue;
        objConfig.Save();
    }
}

在上面的代码片段中,WebConfigurationManager 类的方法 OpenWebConfiguration() 打开根目录中的 Web.Config 文件,并将其作为 Configuration 对象返回。Configuration 类的 GetSection() 方法接受一个特定节的路径作为参数。该路径是从根节点 "configuration" 的相对路径。您可以通过名称分隔的 "/" 来引用更深层次的节点(在此上下文中是节)。例如,要访问 "authentication" 部分,请将 "system.web/authentication" 作为参数传递给 GetSection() 方法。它返回一个通用的 ConfigurationSecton 对象,可以将其类型转换为适当的配置节类。在我们的示例中,我们借助 AppSettingsSection 类获取 "appSettings" 部分。AppSettingsSection 类实例具有一个 Settings 集合属性,其中包含配置节中的应用程序设置,以键值对的形式存储。可以使用键通过索引访问 Settings 属性来获取相应的值。您还可以设置 value 属性并调用 Configuration 对象的 Save() 方法,将 Configuration 实例中的配置写入配置文件。

删除 Web.config 文件中的条目

Settings 集合的 Remove() 方法从 Configuration 实例中删除一个条目。Remove() 方法接受要删除的条目的键。

注意:请不要忘记调用 Configuration 实例的 Save() 方法,以使更改反映在物理文件中。

objAppsettings.Settings.Remove("Location");

要遍历配置节中的所有键值对,可以通过 Settings 集合的 AllKeys 属性访问键的字符串数组。

foreach (string strKey in objAppsettings.Settings.AllKeys)
{
    DataRow dr = dt.NewRow();
    dr["Key"] = strKey;
    dr["Value"] = objConfig.AppSettings.Settings[strKey].Value;
    dt.Rows.Add(dr);
}

加密 Web.Config 文件中的节

现在到了安全问题。有时需要保护配置文件的一部分。在 .NET 2.0 中,可以选择以编程方式加密 Web.config 文件的部分内容。以下方法加密 Web.config 文件中的 "appSettings" 部分。

private void EncryptAppSettings()  
{
    Configuration objConfig = 
      WebConfigurationManager.OpenWebConfiguration(Request.ApplicationPath);
    AppSettingsSection objAppsettings = 
      (AppSettingsSection)objConfig.GetSection("appSettings");
    if (!objAppsettings.SectionInformation.IsProtected)
    {
        objAppsettings.SectionInformation.ProtectSection(
                       "RsaProtectedConfigurationProvider");
        objAppsettings.SectionInformation.ForceSave = true;
        objConfig.Save(ConfigurationSaveMode.Modified);
    }
}

上面的代码打开 Web.Config 文件进行修改。然后检索 "appSettings" 部分。SectionInformation 类的 ProtectSection() 方法标记配置节以进行保护。它接受要用于加密的保护提供程序的名称。ForceSave 属性指示是否即使指定的配置节未被修改也要保存它。最后,Configuration 对象的 Save() 将配置设置写入 Web.Config 文件。传递给 Save() 方法的参数指示只需将修改后的属性写入物理文件。

下面是加密前 "appSettings" 部分的列表

Screenshot - WebConfig.jpg

下面列出了加密后的 "appSettings" 部分

Screenshot - WebConfigEncrypted.jpg

通过代码解密 web.config 文件的部分内容也非常相似。SectionInformation 类的 UnprotectSection() 方法会移除配置节的加密。

private void DecryptAppSettings()
{
    Configuration objConfig = 
      WebConfigurationManager.OpenWebConfiguration(Request.ApplicationPath);
    AppSettingsSection objAppsettings = 
      (AppSettingsSection)objConfig.GetSection("appSettings");
    if (objAppsettings.SectionInformation.IsProtected)
    {
        objAppsettings.SectionInformation.UnprotectSection();
        objAppsettings.SectionInformation.ForceSave = true;
        objConfig.Save(ConfigurationSaveMode.Modified);
    }
}

这种加密和解密功能可以应用于 web.config 文件的其他部分。它主要用于 connectionStrings 部分,通常在这里指定用户名和密码。这可以通过创建 ConfigurationSection 对象来完成。下面是一个 connectionStrings 部分的示例。

ConfigurationSection objConfigSection = objConfig.ConnectionStrings;

ConfigurationSection 类表示配置文件中的一个节。Configuration 类具有每个配置节的属性。此属性可用于获取 respective ConfigurationSection 对象。这是对使用 Configuration 类的 GetSection() 方法的一种替代。

© . All rights reserved.