3

我正在开发的 Web 应用程序使用 log4net 进行日志记录。该项目的一个要求是连接字符串应该被加密。如何告诉 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

2 回答 2

7

在实现drumboog的答案时,由于无限递归的方法调用,我遇到了stackoverflow异常。这基本上是我最终使用的。

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">
于 2012-07-26T15:29:29.213 回答
4

除了编写自定义附加程序之外,您还可以加密整个配置部分:

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

以编程方式加密 .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然后更新配置文件中元素的 type 属性:

<appender name="AdoNetAppender" type="Your.Namespace.DecryptConnectionStringAdoNetAppender">
于 2012-07-25T22:04:37.563 回答