c# - 从 IClientMessageInspector 登录时屏蔽敏感信息

标签 c# .net wcf soap

我正在使用 WCF (.NET 3.5) 与使用 SOAP 的服务器通信。在 Debug模式下运行时,我使用 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() 的输出上使用正则表达式匹配以一种粗略的方式实现这一点但我想知道是否有更优雅、更高效的方法允许我在将消息转换为字符串之前修改 password 元素的值。

最佳答案

对此没有简单的方法,除非您确保永远不会以这种方式发送凭据(有很多方法可以发送 token 而不是实际凭据)。

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

顺便说一句,如果你想在开发中记录消息,你最好利用 WCF 跟踪基础结构而不是自己进行低级跟踪(这样你就不必在 Debug模式下添加检查器) .参见 http://msdn.microsoft.com/en-us/library/ms732023.aspx有关内置 WCF 事件和消息跟踪的更多信息。

关于c# - 从 IClientMessageInspector 登录时屏蔽敏感信息,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1839498/

相关文章:

C# 获取显示名称的首字母

c# - 组合 DateTimeOffset 的日期和时间

c# - 将成员函数传递给委托(delegate)时的编译器错误

c# - 你能定义一个接口(interface),使得实现它的类必须包含一个也是该类的成员吗?

c# - WinForms - Form.DoubleBuffered 属性会影响放置在该窗体上的控件吗?

Web 服务和单例 WCF 服务的 WCF 生命周期?

WCF:Close() 真的关闭连接吗?

c# - 构建 Rest API 请求/响应模型的最佳实践

c# - IKVM 和 System.Core System.Runtime.CompilerServices.ExtensionAttribute

c# - 共享 Windows 主机上的 Windows 服务