从IClientMessageInspector进行日志记录时屏蔽敏感信息

时间:2009-12-03 12:01:30

标签: c# .net wcf soap

我正在使用WCF(.NET 3.5)与使用SOAP的服务器进行通信。在调试模式下运行时,我使用System.ServiceMode.Dispatcher.IClientMessageInspector和log4Net来记录请求内容。

public object BeforeSendRequest(ref Message request, IClientChannel channel)
{
    log.Debug(request); 
}

我的困难在于,有时SOAP消息包含在写入日志之前必须屏蔽的身份验证信息 例如在以下示例中,我想将密码元素记录为<password>**********</password>

<s:Envelope xmlns:s="http://schemas.xmlsoap.org/soap/envelope/">
    <s:Header>
        <Action s:mustUnderstand="1" xmlns="http://schemas.microsoft.com/ws/2005/05/addressing/none">http://service.soap.host.com/credentials</Action>
    </s:Header>
    <s:Body xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
        <credentials xmlns="http://service..soap.host.com/credentials">
            <username>MyUsername</username>
            <password>MyPassword</password>
        </credentials>
    </s:Body>
</s:Envelope>

我能够在request.ToString()的输出上使用正则表达式匹配以粗略的方式实现这一点,但我想知道是否有更优雅和有效的方法允许我修改密码元素的值在将消息转换为字符串之前。

1 个答案:

答案 0 :(得分:2)

没有简单的方法,除非您确保不要以这种方式发送凭证(有很多方法可以发送令牌而不是实际的凭证)。

如果您仅传递这些信息以登录您的服务,则无论如何都应使用SSL。如果是这种情况,您的MessageInspector可以检查当前绑定是否使用SSL或传输安全性,如果是这种情况,则不会记录任何内容。

顺便说一句,如果你想在开发中记录消息,你最好利用WCF跟踪基础设施而不是自己进行低级别跟踪(这样你就不必在调试模式下添加检查器) 。有关内置WCF活动和邮件跟踪的详细信息,请参阅http://msdn.microsoft.com/en-us/library/ms732023.aspx