7
votes

CLIENT WCF Passage du jeton de nom d'utilisateur avec Mustonderstand Set to True

Je suis chargé de créer un service WCF qui sera consommé par un client externe. Le client utilise Security WSSE, en particulier, ils passent un jeton de nom d'utilisateur via une en-tête de savon.

Le service WCF est hébergé sur un serveur IIS avec SSL activé.

À ce stade, j'ai un prototype semi-travail. Le problème que je traite maintenant est que l'en-tête SOAP a l'attribut MUSTUNDERSTAND défini à 1, ce qui entraîne l'échec du processus.

Je voudrais des conseils (ou mieux encore, un exemple de code sourires ) sur la manière de gérer le jeton de nom d'utilisateur de manière à renvoyer la réponse appropriée lorsque le Mustonderstand L'attribut est vrai.

Voici un échantillon de la demande de savon qui échoue: xxx

si SOPENNV: MUSTOMDERSTAND = "1" est modifié en SOAPENV: MUSTOMDODERSTAND = "0", puis le processus fonctionne.


ps: voici une demande d'échantillon révisée Le client envoyé: xxx

Je reçois ce qui suit Réponse aux demandes ci-dessus: xxx

Voici la liaison: xxx


6 commentaires

Êtes-vous sûr qu'il utilise WSE (Extensions de service Web)?


Non, je ne suis pas positif. J'ai ajouté à l'échantillon ci-dessus une demande d'échantillon révisée du client envoyé.


Exactement quel est le "échec". Exactement ce qui vous a fait croire que l'échec a été causé par MUSTOMDERSTAND ?


Ajout de la réponse d'erreur à ce qui précède (pas assez de caractères pour tenir dans un commentaire).


Pouvez-vous partager avec nous la liaison que vous utilisez sur votre service? Utilise-t-il wshttpbinding ? En tant qu'expérience, pouvez-vous créer un programme client .NET pour consommer votre service? Est-ce que votre client .NET n'envoie également MUSTUNDERSTAND ?


Ajout de la configuration de liaison ci-dessus. Le client .NET n'envoie pas Mustlarderstand.


3 Réponses :


0
votes

+1 @johnsaunders car il aboie probablement le bon arbre ici.

est votre client .NET / WCF? Sinon, il peut ne pas mettre en œuvre WS-Security, ou du moins pas à la manière dont WCF le souhaite.

Si le client est .NET, il ne s'agit que d'une liaison incompatible du côté client.

Le drapeau Mustonderstand dit que l'en-tête WS-Security doit être reconnu et traité. Un client de sécurité non WS-Security, que ce soit parce qu'il ne parle pas WS-Security ou n'est pas configuré pour, ignorera l'en-tête, essayez d'utiliser le message quand même et le serveur sera le punt.

Votre autre option consiste à tourner de la répudiation sur le serveur. Il arrête d'envoyer des en-têtes WS-Security. Bien sûr, alors vous n'obtenez pas de répudiation.


1 commentaires

Je suis assez certain que c'est un client Java, mais je ne sais pas quelle saveur.



2
votes

Votre reliure est BasichttpLinding . Vous devez utiliser wshttpbinding .


0 commentaires

1
votes

J'ai résolu ce problème en n'utilisant pas l'en-tête Généré WS-Securither (lorsque vous ajoutez la référence de service) dans la configuration de la WCF, mais plutôt en commentant cette sortie et que vous laissez .NET générer l'en-tête lui-même en utilisant des informations d'identification du client et en spécifiant un Mode de sécurité de "TransportwithMessAreDential":

 <client>
        <endpoint ...>
            <!--<headers>
                <wsse:Security...>
                </wsse:Security>
            </headers>-->
        </endpoint>
 </client>


0 commentaires