2010-01-13 7 views
3

J'ai créé un prototype de client de services Web en utilisant les API disponibles dans weblogic 10.3. On m'a dit que je devais utiliser Metro 2.0 à la place (il est déjà utilisé pour d'autres projets). Le problème que j'ai rencontré est que le WSDL n'inclut aucune information de politique de sécurité mais un nom d'utilisateur est requis pour chaque appel de méthode. Dans weblogic, j'ai pu écrire mon propre fichier xml de politique et instancier mon service avec celui-ci (voir ci-dessous), mais je n'arrive pas à comprendre comment faire de même avec Metro.Metro UsernameToken Policy

policy.xml

<?xml version="1.0"?> 
    <wsp:Policy 
     xmlns:wsp="http://schemas.xmlsoap.org/ws/2004/09/policy" 
     xmlns:sp="http://docs.oasis-open.org/ws-sx/ws-securitypolicy/200512"> 
     <sp:SupportingTokens> 
     <wsp:Policy> 
      <sp:UsernameToken 
      sp:IncludeToken="http://docs.oasis-open.org/ws-sx/ws-securitypolicy/200512/IncludeToken/AlwaysToRecipient"> 
      <wsp:Policy> 
       <sp:WssUsernameToken10/> 
       <sp:HashPassword/> 
      </wsp:Policy> 
      </sp:UsernameToken> 
     </wsp:Policy> 
     </sp:SupportingTokens> 
    </wsp:Policy> 

Client.java (Weblogic)

 ClientPolicyFeature cpf = new ClientPolicyFeature(); 
     InputStream asStream = WebServiceSoapClient.class.getResourceAsStream("Policy.xml"); 
     cpf.setEffectivePolicy(new InputStreamPolicySource(asStream)); 

     try 
     { 
     webService = new WebService(new URL("http://192.168.1.10/WebService/WebService.asmx?wsdl"), new QName("http://testme.com", "WebService")); 
     } 
     catch (MalformedURLException e) 
     { 
     e.printStackTrace(); 
     } 

     WebServiceSoap client = webService.getWebServiceSoap(new WebServiceFeature[] {cpf});  

     List<CredentialProvider> credProviders = new ArrayList<CredentialProvider>();  
     String username = "user"; 
     String password = "pass"; 
     CredentialProvider cp = new ClientUNTCredentialProvider(username.getBytes(), password.getBytes());  
     credProviders.add(cp); 

     Map<String, Object> rc = ((BindingProvider) client).getRequestContext(); 
     rc.put(WSSecurityContext.CREDENTIAL_PROVIDER_LIST, credProviders); 

... 

Je suis en mesure de générer mes classes de proxy en utilisant Metro mais je ne peux pas comprendre comment le configurer pour envoyer le Nom d'utilisateurToken. J'ai essayé plusieurs exemples différents du web qui n'ont pas fonctionné. Toute aide serait appréciée.

Répondre

0

Peut-être vérifier Implementing the WS-Security UsernameToken Profile for Metro-based web services. Ce tutoriel m'a été utile dans le passé.

+0

Merci. J'ai utilisé ce tutoriel et j'ai pu obtenir la politique en modifiant le WSDL. J'espérais vraiment qu'il y aurait une approche similaire à Weblogic où je pourrais l'installer par programmation. – Rodney

+0

J'espère aussi une méthode où je n'ai pas besoin de modifier le WSDL. Dans mon cas, le WSDL est géré par un tiers et je n'ai aucun contrôle sur ce qui s'y trouve. –

Questions connexes