2012-07-25 162 views
1

我正在使用的Web应用程序使用log4net进行日志记录。该项目的一个要求是连接字符串应该被加密。我如何告诉log4net使用解密值?如何从web.config中获取log4net来解密加密的连接字符串?

例如:

<log4net> 
    <root> 
     <level value="Debug"/> 
     <appender-ref ref="AdoNetAppender"/> 
    </root> 
    <appender name="AdoNetAppender" type="log4net.Appender.AdoNetAppender"> 
     <bufferSize value="1"/> 
     <connectionType value="System.Data.SqlClient.SqlConnection, System.Data, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089"/> 
     <connectionString value="encryptedconnectionstringhere=="/> 

有没有办法做到这一点?

回答

4

在实施drumboog的回答,我跑进计算器例外由于无限递归方法调用。这实际上是我最终使用的。

public class CustomAdoNetAppender : AdoNetAppender 
{ 
    private string _connectionString; 
    protected override string ResolveConnectionString(out string connectionStringContext) 
    { 
     if(string.IsNullOrEmpty(_connectionString)) 
     { 
      var decrypt = new MyDecyptionLib(); 
      _connectionString = decrypt.MyDecryptionFunction(ConfigurationManager.AppSettings["Connection"]); 
     } 

     connectionStringContext = _connectionString; 
     return connectionStringContext; 
    } 

} 

...在log4net的配置部分

<appender name="AdoNetAppender" type="My.Name.Space.To.CustomAdoNetAppender"> 
+1

是的,我想'ResolveConnectionString'会引入不必要的递归......它应该调用'base.ResolveConnectionString'来代替它,以便它会回调到父实现(我已经为未来的观察者更新了答案)。如果您在appender设置中提供了连接字符串名称,而不是实际的连接字符串,那么您需要这样做的唯一原因是。 AdoNetAppender根据几个配置属性解析实际的连接字符串。在你的情况下,这可能没有必要。 – 2012-07-26 16:56:22

3

除了编写定制的附加器,你可以加密整个配置部分:

http://msdn.microsoft.com/en-us/library/zhhddkxy.aspx

Programmatically encrypting a config-file in .NET

编辑:

log4net的是开源的,所以你也可以尝试查看他们的代码并定制他们的appender以满足您的需求......也许是这样的:

public class DecryptConnectionStringAdoNetAppender : AdoNetAppender 
{ 
    protected override string ResolveConnectionString(out string connectionStringContext) 
    { 
     string result = base.ResolveConnectionString(out connectionStringContext); 
     if (String.IsNullOrEmpty(result)) 
     { 
      return result; 
     } 
     else 
     { 
      Decrypt(result); 
     } 
    } 

    private string Decrypt(string encryptedValue) 
    { 
     // Your code goes here. 
    } 
} 

然后appender元素的配置文件的类型属性更新:

<appender name="AdoNetAppender" type="Your.Namespace.DecryptConnectionStringAdoNetAppender"> 
+0

有趣。我们真的只关心连接字符串。该团队已经编写了实用程序来加密/解密字符串。我可以在自定义appender中使用这些进程吗? – quakkels 2012-07-25 22:07:34

+0

是...看到上面的更新。 – 2012-07-25 22:11:57

+0

查看log4net代码后...看起来可能有更好的选择。请参阅我上面的更新。 – 2012-07-25 22:41:20