Web.config中的自动加密连接字符串

时间:2015-01-05 20:45:09

标签: c# encryption web-config

我有以下类来加密连接字符串

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;

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

namespace App.WebUI.Infrastructure
{
    public static class ConnectionStringEncryption
    {
        private static readonly string Path = HttpRuntime.AppDomainAppVirtualPath;

        public static void EncryptConnString()
        {
            Configuration config = WebConfigurationManager.OpenWebConfiguration(Path);
            ConfigurationSection section = config.GetSection("connectionStrings");
            if (!section.SectionInformation.IsProtected)
            {
                section.SectionInformation.ProtectSection("RsaProtectedConfigurationProvider");
                config.Save();
            }
        }

        public static void DecryptConnString()
        {
            Configuration config = WebConfigurationManager.OpenWebConfiguration(Path);
            ConfigurationSection section = config.GetSection("connectionStrings");
            if (section.SectionInformation.IsProtected)
            {
                section.SectionInformation.UnprotectSection();
                config.Save();
            }
        }
    }
}

在Global.asax.cs

        if(!System.Diagnostics.Debugger.IsAttached)
            ConnectionStringEncryption.EncryptConnString();

当我在没有&#34的情况下尝试本地时,如果(!System.Diagnostics.Debugger.IsAttached)"工作正常,但是当我发布时,我得到以下错误。访问路径' ... \ web.config'被拒绝。

我无权更改服务器中文件的权限,我不想这样做。

有没有其他方法可以在不更改权限的情况下完成此操作?

由于

1 个答案:

答案 0 :(得分:0)

以某种方式,加密web.config文件的过程需要获得写入权限,原因显而易见。也许您应该问的问题是如何以具有写入文件权限的用户身份运行该过程。我的答案是,您要么将AppPool更改为使用具有写入文件权限的用户,要么将代码放入另一种执行的可执行文件中,例如,在安装时(作为管理员)在运行时。

如果您因为没有正确的机器密钥而无法解密加密的web.config文件,那么您应该设计一个进程,在安装过程中加密目标计算机上的文件,而不是在应用程序运行时。您需要询问有关发布过程的更多信息,因为您不应使用运行该应用程序的同一帐户加密该文件。您应该有一个在目标计算机上运行的安装过程。