Маскировка конфиденциальной информации при входе в систему из IClientMessageInspector - PullRequest
2 голосов
/ 03 декабря 2009

Я использую 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 Ответ

2 голосов
/ 03 декабря 2009

Нет простого способа для этого, за исключением того, что вы НИКОГДА не отправляете учетные данные таким образом (есть много способов отправить токены вместо реальных учетных данных).

Если вы передаете эту информацию только для входа в службу, вам все равно следует использовать SSL. Если это так, ваш MessageInspector может проверить, использует ли текущая привязка SSL или безопасность транспорта и, если это так, ничего не регистрирует.

Кроме того, если вы хотите регистрировать сообщения в процессе разработки, вам лучше использовать инфраструктуру трассировки WCF, а не выполнять трассировку низкого уровня самостоятельно (таким образом вам не нужно добавлять инспекторов в режиме отладки) , См. http://msdn.microsoft.com/en-us/library/ms732023.aspx для получения дополнительной информации о встроенной активности WCF и трассировке сообщений.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...