2017-06-15 7 views
2

J'ai un point de terminaison du service WCF. Le service est configuré en tant que service WCF avec le mode de sécurité = TransportWithMessageCredential et la sécurité de message clientCredentialType définie sur Username à l'aide d'un CustomValidator pour la validation du nom d'utilisateur/mot de passe.ColdFusion cfinvoke (Message Security - ClientCredentials = Nom d'utilisateur)

Je possède ce code dans un C# Application console (qui fonctionne):

ServiceClient client = new ServiceClient(); 
    client.ClientCredentials.UserName.UserName = "myusername"; 
    client.ClientCredentials.UserName.Password = "mypassword"; 
    Console.WriteLine(client.GetVersion()); 

Le code ci-dessus fonctionne - ce qui est l'équivalent ColdFusion utilisant cfinvoke? J'ai actuellement les suivantes (qui a bien fonctionné avant l'introduction nom d'utilisateur/mot de passe)

<cfinvoke 
webservice="#wsurl#" 
method="getVersion" 
returnvariable="gcversion" 
refreshwsdl="true"> 
</cfinvoke> 

Où est l'endroit approprié pour inclure les « authentification du client »?

EDIT: Il semble que le service utilise 'WS-Security'. J'ai du mal à trouver des informations sur le soutien de CF2016 pour WS-Security. Il semble que ce soit une norme, donc je ne suis pas sûr de savoir pourquoi trouver des informations a été difficile.

Si quelqu'un pouvait fournir n'importe quelle ressource, je serais vraiment reconnaissant.

EDIT2: Je suis en train de le faire: `` ` ws = CreateObject ("webservice", wsurl, {refreshwsdl = true});

objSoapHeader = XmlParse("<wsse:Security mustUnderstand=""false"" xmlns:wsse=""http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd""><wsse:UsernameToken><wsse:Username>myun</wsse:Username><wsse:Password>mypass</wsse:Password></wsse:UsernameToken></wsse:Security>"); 

addSOAPRequestHeader(ws, "ignoredNameSpace", "ignoredName", objSoapHeader,false); 

version =ws.getVersion(); 
writeOutput(version); 

mais je reçois l'erreur suivante:

Cannot perform web service invocation getVersion. 
The fault returned when invoking the web service operation is: 

org.apache.axis2.AxisFault: Must Understand check failed for header http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd : Security 

    at org.apache.axis2.engine.AxisEngine.checkMustUnderstand(AxisEngine.java:105) 

    at org.apache.axis2.engine.AxisEngine.receive(AxisEngine.java:171) 

    at org.apache.axis2.description.OutInAxisOperationClient.handleResponse(OutInAxisOperation.java:364) 

    at org.apache.axis2.description.OutInAxisOperationClient.send(OutInAxisOperation.java:421) 

    at org.apache.axis2.description.OutInAxisOperationClient.executeImpl(OutInAxisOperation.java:229) 

    at org.apache.axis2.client.OperationClient.execute(OperationClient.java:165) 

    at cwtgift.CWTGiftServiceStub.getVersion(CWTGiftServiceStub.java:1954) 

    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 

    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) 

    The error occurred in C:/ColdFusion2016/cfusion/wwwroot/test/getVersion.cfm: line 19 

    17 :  addSOAPRequestHeader(ws, "ignoredNameSpace", "ignoredName", objSoapHeader,false); 
    18 : 
    19 :  version =ws.getVersion(); 
    20 :  writeOutput(version); 
    21 : </cfscript> 

Répondre

2

Sans connaître des détails de votre serviceclient(), je pense à l'aide cfinvokeargument est probablement le meilleur moyen de passer votre nom d'utilisateur/mot de passe :

<cfinvoke webservice="#wsurl#" 
    method="getVersion" 
    returnvariable="gcversion" 
    refreshwsdl="true"> 

    <cfinvokeargument name="UserName" value="myusername" /> 
    <cfinvokeargument name="Password" value="mypassword" /> 

</cfinvoke> 

Si vous avez besoin de toucher un point de terminaison non t configuré en tant que service Web, vous pouvez également utiliser CFHTTP de façon similaire (je ne l'ai pas détaillé tous les arguments ou les valeurs ici, vous aurez envie de se référer à https://helpx.adobe.com/coldfusion/cfml-reference/coldfusion-tags/tags-g-h/cfhttp.html pour tous les détails):

<cfhttp url="" method="" throwOnError="" multipart="" path="" file="" name="" result=""> 

    <cfhttpparam type="" name="UserName" value="myusername" /> 
    <cfhttpparam type="" name="Password" value="mypassword" /> 

</cfhttp> 
+0

Ajout supplémentaire détails à la question –

+0

Est-ce l'authentification de base? Si c'est le cas, essayez plutôt les attributs de nom d'utilisateur et de mot de passe. – Leigh

+0

Salut @Leigh, je ne crois pas que ce soit l'authentification de base. C'est l'authentification WSS. Dans l'interface utilisateur Soap, je dois définir le type de mot de passe WSS sur 'Texte', puis utiliser le nom d'utilisateur et le mot de passe sous Basic. J'ai essayé d'utiliser les attributs nom d'utilisateur et mot de passe, ainsi que le paramètre authType BASIC –