2009-12-03 3 views
2

J'utilise WCF (.NET 3.5) pour communiquer avec un serveur utilisant SOAP. Lors de l'exécution en mode débogage, j'utilise System.ServiceMode.Dispatcher.IClientMessageInspector et log4Net pour enregistrer le contenu de la requête.Masquage des informations sensibles lors de la connexion à partir de IClientMessageInspector

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

Ma difficulté est que, parfois, le message SOAP contient des informations d'authentification que je dois masquer avant d'écrire aux journaux par exemple dans l'exemple suivant, je voudrais enregistrer l'élément de mot de passe <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> 

Je suis en mesure d'y parvenir d'une manière brute en utilisant l'expression régulière correspondant à la sortie de request.ToString() mais je me demande s'il y a un plus élégant et approche efficace qui me permettra de modifier la valeur de l'élément de mot de passe avant de convertir le message en une chaîne.

Répondre

2

Aucun moyen simple pour cela, sauf si vous vous assurez de ne jamais envoyer d'informations d'identification de cette façon (il existe plusieurs façons d'envoyer des jetons au lieu des informations d'identification réelles).

Si vous transmettez ces informations uniquement pour vous connecter à votre service, vous devez quand même utiliser SSL. Si tel est le cas, votre MessageInspector peut vérifier si la liaison en cours utilise la sécurité SSL ou de transport et si c'est le cas, ne consigne rien. En outre, si vous voulez consigner des messages en développement, vous feriez mieux de tirer parti de l'infrastructure de traçage WCF plutôt que de faire le traçage de bas niveau vous-même (de cette façon vous n'avez pas besoin d'ajouter des inspecteurs en mode débogage). Voir http://msdn.microsoft.com/en-us/library/ms732023.aspx pour plus d'informations sur l'activité WCF intégrée et le suivi des messages.

Questions connexes