Edit and Encrypt Web.Config Sections Using C# 2.0

Introduction

ASP.NET 1.x allowed configurations in web.config file to be read from a .NET application. But, there were no options to manipulate Web.Config contents programatically. To achieve this, you had to consider the Web.Config file as a normal file or an XML file. .NET 2.0 fills this gap and also provides many other useful operations to be carried out on a Web.Config file, such as editing and encrypting sections of the Web.Config file. This articles illustrates these functionalities via a sample ASP.NET application.

Using the Code

The classes and methods to take control of the Web.Config file span across two namespaces:

  • System.Configuration
  • System.Web.Configuration

Each section in the Web.Config file has a corresponding class in either of the namespaces. These classes allow modification of the corresponding sections. The classes for sections within the "system.web" section are found in System.Web.Configuration. Classes for other sections that are not specific to Web.Config are found in System.Configuration.

Modifying a section in Web.Config

  1. Open Web.Config for editing by using the WebConfigurationManager class.
  2. Use the respective Configuration class to make the necessary changes.
  3. Save the changes to the physical file by using the Configuration class.
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();
   }
}

In the above piece of code, the OpenWebConfiguration() method of the WebConfigurationManager class opens the Web.Config file in the root directory and returns it as a Configuration object. The GetSection() method of the Configuration class accepts the path to a specific section as an argument. The path is the relative path from the root node "configuration". You can refer to deeper nodes (sections, in this context) by their names separated by '/'. For example, to get access to the "authentication" section, provide "system.web/authentication" as the parameter to the GetSection() method. It returns a generic ConfigurationSecton object that can be typecast to the proper configuration section class. In this example, you get hold of the "appSettings" section with the help of the AppSettingsSection class. The AppSettingsSection class instance has a Settings collection property that contains the application setting from the configuration section as key-value pairs. The Settings property can be indexed using key to get the corresponding value. You also can set the value property and call the Save() method of the Configuration object to write configurations in the Configuration instance to the config file.

Deleting an entry in the Web.config file

The Remove() method of the Settings collection deletes an entry from the Configuration instance. The Remove() method accepts the key of the entry to be deleted.

Note: Please do not forget to call the Save() method of the Configuration instance to get the chnages reflected in the physical file.
objAppsettings.Settings.Remove("Location");

To iterate through all the key-value pairs in a configuration section, access the string array of keys via the AllKeys property of the Settings collection.

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);
}

Encrypting sections in Web.Config file

Now come the security issues. At times, the necessity for protecting sections the of config file arises. In .NET 2.0, there are options available to encrypt sections the of Web.config file programatically. The following method encrypts the "appSettings" section in the Web.config file.

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);
   }
}

The code above opens the Web.Config file for modification. It then retrieves the "appSettings" section. The ProtectSection() method of the SectionInformation class marks the configuration section for protection. It accepts the name of the protection provider to be used for the encryption. The ForceSave property indicates whether the specified configuration section will be saved even if it has not been modified. Finally, the Save() of the Configuration object writes the configuration settings to the Web.config file. The argument to the Save() method indicates the only properties modified needed to be written to the physical file.

Below is a listing of the "appSettings" section before encryption:

The encrypted "appSettings" section is listed below:

Decrypting sections of web.config file through code is practically identical. The UnprotectSection() method of the SectionInformation class removes the encryption from the configuration section.

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);
   }
}

This encrytion and decryption functionality can be applied to other sections of web.config file also. It comes into use mostly for the "connectionStrings" section where the user name and password usually would be specified. This can done by creating a ConfigurationSection object. An example for the "connectionStrings" section is listed below.

ConfigurationSection objConfigSection = objConfig.ConnectionStrings;

The ConfigurationSection class represents a section within the configuration file. The Configuration class has propertes for each configuration section. This property can be used to get the respective ConfigurationSection objects. This is an alternative to the usage of the GetSection() method of the Configuration class.



About the Author

Mohammed Habeeb

Mohammed Habeeb works as a software developer for an IT company in Dubai. He holds a bachelors in Computer Science Engineering from MES College, Calicut University. He is also a Microsoft Certified Application Developer (MCAD) in .NET Framework. He has a strong inclination towards Microsoft technologies especially the .NET Platform. He has been an active member of Cochin and Bangalore Microsoft user groups. He has a strong passion for science and technology. His interests span through travelling, driving, photography, stamps and coin collection. You can find more about him @ http://www.habeebonline.com

Downloads

Comments

  • BUT, IIS displayes the encrypted content!!!

    Posted by anwarsayeed on 07/05/2007 03:17am

    After encrypting, if you go to the website in IIS and properties, Edit configuration in ASP.NET section, will bring you all the encrypted values decrypted!!!!!! Any idea how to protect the data from displaying like this????

    Reply
Leave a Comment
  • Your email address will not be published. All fields are required.

Top White Papers and Webcasts

  • Live Event Date: November 20, 2014 @ 2:00 p.m. ET / 11:00 a.m. PT Are you wanting to target two or more platforms such as iOS, Android, and/or Windows? You are not alone. 90% of enterprises today are targeting two or more platforms. Attend this eSeminar to discover how mobile app developers can rely on one IDE to create applications across platforms and approaches (web, native, and/or hybrid), saving time, money, and effort and introducing apps to market faster. You'll learn the trade-offs for gaining long …

  • Live Event Date: October 29, 2014 @ 11:00 a.m. ET / 8:00 a.m. PT Are you interested in building a cognitive application using the power of IBM Watson? Need a platform that provides speed and ease for rapidly deploying this application? Join Chris Madison, Watson Solution Architect, as he walks through the process of building a Watson powered application on IBM Bluemix. Chris will talk about the new Watson Services just released on IBM bluemix, but more importantly he will do a step by step cognitive …

Most Popular Programming Stories

More for Developers

Latest Developer Headlines

RSS Feeds