2010-01-13 2 views
3

Я создал прототип клиента веб-сервисов, используя api, доступный в weblogic 10.3. Мне сказали, что мне нужно использовать Metro 2.0 вместо этого (он уже используется для других проектов). Проблема, с которой я сталкиваюсь, заключается в том, что WSDL не содержит никакой информации о политике безопасности, но для каждого вызова метода требуется UsernameToken. В weblogic я смог написать свой собственный XML-файл политики и создать экземпляр моей службы (см. Ниже), однако я не могу понять, как сделать то же самое с 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); 

... 

Я способен генерировать свои прокси-классы с использованием Metro, однако я не могу понять, как настроить его, чтобы отправить UsernameToken. Я попытался несколько разных примеров из Интернета, которые не работали. Любая помощь будет оценена по достоинству.

ответ

0

Возможно, выезд Implementing the WS-Security UsernameToken Profile for Metro-based web services. Этот урок был полезен для меня в прошлом.

+0

Спасибо. Я использовал этот учебник и смог настроить политику, изменив WSDL. Я действительно надеялся, что будет подход, похожий на Weblogic, где я мог бы настроить его программно. – Rodney

+0

Я также надеюсь на метод, когда мне не нужно изменять WSDL. В моем случае WSDL поддерживается третьей стороной, и я не контролирую, что там происходит. –

Смежные вопросы