我创建了一个自定义受保护的配置提供程序,以便使用 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 中的这条烦人的消息外,一切正常。我一直在谷歌上搜索很多试图找到答案但无济于事。任何人都可以帮忙吗?