2009-08-07 4 views
6

J'ai des difficultés à me connecter à un service Web WSE 3.0 tiers à partir d'un client WCF. Je l'ai mis en œuvre la classe de liaison personnalisée comme indiqué dans cet article KB:Connexion à un service Web WSE 3.0 à partir d'un client WCF

http://msdn.microsoft.com/en-us/library/ms734745.aspx

Le problème semble avoir à voir avec l'affirmation de sécurité utilisé par le service Web - UsernameOverTransport.

Lorsque je tente d'appeler une méthode, je reçois l'exception suivante:

System.InvalidOperationException:. Le 'WseHttpBinding' '[namespace]' liaison pour le 'MyWebServiceSoap' '[. namespace] ' contrat est configuré avec un mode d'authentification qui nécessite intégrité du niveau de transport et la confidentialité . Cependant le transport ne peut pas assurer l'intégrité et la confidentialité ..

Il attend un nom d'utilisateur, mot de passe et le numéro CN. Dans l'exemple de code fourni par le fournisseur, ces informations d'identification sont regroupées dans un fichier Microsoft.Web.Services3.Security.Tokens.UsernameToken. Voici l'exemple fourni par le vendeur:


Cela fonctionne très bien à partir d'une application 2.0 w/WSE 3.0 installé. Voici un extrait du code de mon client WCF:

EndpointAddress address = new EndpointAddress(new Uri("<web service uri here>")); 

WseHttpBinding binding = new WseHttpBinding(); // This is the custom binding I created per the MS KB article 

binding.SecurityAssertion = WseSecurityAssertion.UsernameOverTransport; 
binding.EstablishSecurityContext = false; 

// Not sure about the value of either of these next two 
binding.RequireDerivedKeys = true; 
binding.MessageProtectionOrder = MessageProtectionOrder.SignBeforeEncrypt; 

MembershipServiceSoapClient proxy = new MembershipServiceSoapClient(binding, address); 

// This is where I believe the problem lies – I can’t seem to properly setup the security credentials the web service is expecting 

proxy.ClientCredentials.UserName.UserName = "username"; 
proxy.ClientCredentials.UserName.Password = "pwd"; 
// How do I supply the CN number?      

MyObject mo = proxy.MyMethod(); // this throws the exception 

J'ai écumé le web à la recherche d'une réponse à cette question. Certaines sources me rapproche (comme l'article MS KB), mais je n'arrive pas à surmonter la bosse. Est-ce que quelqu'un peut m'aider?

+0

Pour être sûr, votre tiers sait-il que WSE est obsolète? –

+0

Avez-vous été en mesure de résoudre ce problème? est-ce que quelqu'un a une idée? Je suis actuellement coincé sur la même chose. –

Répondre

1

Le message d'erreur fait référence à Niveau de transport Sécurité, cela signifie généralement https.

Vous n'avez pas montré vos fichiers de configuration. Mais je devine que vous avez configuré la sécurité pour le transport (ou il est requis comme une consiquence d'un autre choix) et utilisé une adresse qui est http au lieu de https.

+0

Salut Shiraz, merci d'avoir répondu. Je définis le SecurityAssertion en tant que UserNameOverTransport par programmation dans le code que je fournis ci-dessus. Le service Web n'utilise pas https, donc je ne crois pas que ce soit le problème. –

+0

Je pense que c'est pourquoi vous obtenez l'erreur. Vous envoyez le nom d'utilisateur/mot de passe sur le transport, WCF voit alors que le mot de passe passera sur le fil non crypté et refuse de démarrer le service. –

+0

Il semble que ce serait une différence majeure entre WSE3.0 et WCF, alors. Je peux utiliser un client WSE 3.0 sans SSL pour me connecter à mon service WSE3, mais un client WCF ne se connectera pas avec le même message que Dave a reçu dans son exemple. –

9

Je REUSSI dans un cas similaire avec la configuration de liaison suivante:

<bindings> 
    <customBinding> 
     <binding name="FNCEWS40MTOMBinding"> 
     <security enableUnsecuredResponse="true" authenticationMode="UserNameOverTransport" 
        allowInsecureTransport="true" messageProtectionOrder="SignBeforeEncrypt"> 
      <secureConversationBootstrap /> 
     </security> 
     <mtomMessageEncoding messageVersion="Soap12WSAddressingAugust2004" 
           maxBufferSize="2147483647" /> 
     <httpTransport maxReceivedMessageSize="2147483647" /> 
    </binding> 
    </customBinding> 
</bindings> 

espérons que cela fonctionne pour vous aussi.

Questions connexes