在ASP.NET 2.0中操作数据之七十一:保护连接字符串(2)

  打开AdvancedDAL文件夹里的EncryptingConfigSections.aspx页面,拖一个TextBox控件到页面,设其ID为WebConfigContents;TextMode属性为MultiLine;Width和Rows属性分别为95% 和 15.该TextBox控件用于显示Web.config文件的内容,以查看其内容是否已经加密了.当然,在现实程序里,我们不可能将Web.config文件的内容显示出来.

  在该TextBox控件下面添加2个Button控件,ID分别为EncryptConnStrings 和 DecryptConnStrings;设其Text属性为“Encrypt Connection Strings” 和 “Decrypt Connection Strings”.

此时你的界面看起来和下面的差不多:

/uploads/allimg/200612/1H63C3T_0.png


图2:在页面上添加一个TextBox控件和2个Button控件

  接下来,在页面初次登录时我们需要在ID为WebConfigContents的TextBox控件里将Web.config文件的内容显示出来。在页面的后台类里添加如下的代码,该代码添加了一个名为DisplayWebConfig的方法,在Page_Load事件处理器里,当Page.IsPostBack 为 false时便调用该方法:

protected void Page_Load(object sender, EventArgs e) { // On the first page visit, call DisplayWebConfig method if (!Page.IsPostBack) DisplayWebConfig(); } private void DisplayWebConfig() { // Reads in the contents of Web.config and displays them in the TextBox StreamReader webConfigStream = File.OpenText(Path.Combine(Request.PhysicalApplicationPath, "Web.config")); string configContents = webConfigStream.ReadToEnd(); webConfigStream.Close(); WebConfigContents.Text = configContents; }

  该DisplayWebConfig方法调用File class类来打开应用程序的Web.config文件;调用StreamReader class类将内容读入一个字符串;再调用Path class类来获取Web.config文件的物理地址.这3个类都位于System.IO命名空间.所以我们应该在后台类的顶部添加using System.IO声明,又或者在这些类的前面添加“System.IO.”前缀.

  接下来,我们需要为这2个按钮的Click事件添加事件处理器,在一个DPAPI provider里使用机器级密匙对<connectionStrings>节点进行加密和解密.在设计器里,双击这2个按钮以添加Click事件处理器,添加如下代码:

protected void EncryptConnStrings_Click(object sender, EventArgs e) { // Get configuration information about Web.config Configuration config = WebConfigurationManager.OpenWebConfiguration(Request.ApplicationPath); // Let's work with the <connectionStrings> section ConfigurationSection connectionStrings = config.GetSection("connectionStrings"); if (connectionStrings != null) // Only encrypt the section if it is not already protected if (!connectionStrings.SectionInformation.IsProtected) { // Encrypt the <connectionStrings> section using the // DataProtectionConfigurationProvider provider connectionStrings.SectionInformation.ProtectSection( "DataProtectionConfigurationProvider"); config.Save(); // Refresh the Web.config display DisplayWebConfig(); } } protected void DecryptConnStrings_Click(object sender, EventArgs e) { // Get configuration information about Web.config Configuration config = WebConfigurationManager.OpenWebConfiguration(Request.ApplicationPath); // Let's work with the <connectionStrings> section ConfigurationSection connectionStrings = config.GetSection("connectionStrings"); if (connectionStrings != null) // Only decrypt the section if it is protected if (connectionStrings.SectionInformation.IsProtected) { // Decrypt the <connectionStrings> section connectionStrings.SectionInformation.UnprotectSection(); config.Save(); // Refresh the Web.config display DisplayWebConfig(); } }

  这2个按钮的事件处理器的代码几乎是一样的.它们一开始都通过WebConfigurationManager class类的OpenWebConfiguration方法获取当前应用程序的Web.config文件的信息. 该方法根据指定的有效路径返回web配置文件。接下来,再通过Configuration class类的GetSection(sectionName)方法访问Web.config文件的<connectionStrings>节点.该方法返回一个ConfigurationSection对象.

  该ConfigurationSection对象包含了一个SectionInformation属性,用来阐述加密节点的其它相关信息. 就像上面的代码显示的那样,我们通过查看SectionInformation的IsProtected属性来判断是否对配置节点进行了加密.此外,还可以通过SectionInformation的ProtectSection(provider) 和 UnprotectSection方法对节点进行加密或解密.

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/wjwywd.html