1

我创建了一个自定义受保护的配置提供程序,以便使用 X509Certificate 加密我们项目 web.config 的 2 个部分,其中一个是自定义部分,另一个是 connectionStrings 部分。除了一个烦人的问题外,这一切都很好。

每次我在 Visual Studio 2012 中运行应用程序时,都会收到以下错误消息:

从配置文件获取连接字符串信息时出现以下错误。“加载配置时出错:无法加载文件或程序集 FirstTitle.FastTitle.Security.X509ProtectedConfigurationProvider,版本 = 1.0.0.0,文化 = 中性,PublicKeyToken = d9b660f7f535363a”

但是,该站点继续运行,并且运行良好,并且自定义配置提供程序按预期实例化并成功解密了 web.config。

如果我将包含提供程序的程序集安装到 GAC 中,则不会出现该消息,但是鉴于有许多开发人员在从事此项目,我真的不希望他们在运行之前必须将程序集安装到 GAC 中该项目。

此外,我不认为它应该安装到 GAC 中,因为它只会在这个项目中单独使用。

更多信息:

我的配置提供程序位于其自己的名为 FirstTitle.FastTitle.Security.X509ProtectedConfigurationProvider 的已签名项目中。

提供者的代码如下(接口只是一个自定义接口):

public class X509ProtectedConfigurationProvider : ProtectedConfigurationProvider,   IX509ProtectedConfigurationProvider
{
    #region Private Fields

    private const string _certNameConfigEntry = "CertSubjectDistinguishedName";

    private X509Certificate2 certificate = null;

    #endregion

    public override void Initialize(string name, System.Collections.Specialized.NameValueCollection config)
    {
        base.Initialize(name, config);

        // Get the CN for the cert from the config.
        string certSubjectDistinguishedName = config[_certNameConfigEntry];

        // Get the certificate form the local cert store.
        X509Store certStore = new X509Store(StoreLocation.LocalMachine);

        try
        {
            certStore.Open(OpenFlags.ReadOnly);

            // Find the matching certificate
            X509Certificate2Collection certs = certStore.Certificates.Find(X509FindType.FindBySubjectDistinguishedName, certSubjectDistinguishedName, true);

            if (certs.Count > 0)
            {
                certificate = certs[0];
            }
            else
            {
                certificate = null;
            }
        }
        finally            
        {
            certStore.Close();
        }
    }

    public override System.Xml.XmlNode Decrypt(System.Xml.XmlNode encryptedNode)
    {
        // Load the config unto an XML document.
        XmlDocument doc = encryptedNode.OwnerDocument;
        EncryptedXml eXml = new EncryptedXml(doc);
        eXml.DecryptDocument();
        return doc.DocumentElement;
    }


    public override System.Xml.XmlNode Encrypt(System.Xml.XmlNode node)
    {
        // Load the config into an XML document.
        XmlDocument doc = new XmlDocument();
        doc.PreserveWhitespace = true;
        doc.LoadXml(node.OuterXml);

        EncryptedXml eXml = new EncryptedXml();
        EncryptedData eData = eXml.Encrypt(doc.DocumentElement, certificate);
        return eData.GetXml();
    }
}

web.config 中的 configProtectedData 元素设置如下(出于安全原因,我删除了证书的名称):

<configProtectedData>
  <providers>
    <add name="X509Provider" type="FirstTitle.FastTitle.Security.X509ProtectedConfigurationProvider, FirstTitle.FastTitle.Security.X509ProtectedConfigurationProvider, Version=1.0.0.0, Culture=neutral, PublicKeyToken=d9b660f7f535363a, processorArchitecture=MSIL"  CertSubjectDistinguishedName="CN=NameRemoved"></add>
  </providers>
</configProtectedData>

正如我所说,除了出现在 VS2012 中的这条烦人的消息外,一切正常。我一直在谷歌上搜索很多试图找到答案但无济于事。任何人都可以帮忙吗?

4

0 回答 0