2012-05-29 2 views
1

Я пытаюсь развернуть клиент Android 3.0 для WSF WS-Security. WCF WS реализует токен имени пользователя в качестве доступа к безопасности. Я использую KSOAP2 и у меня нет никаких проблем, чтобы получить доступ к службе ASMX, но когда я пытаюсь сделать вызов в WCF WS приложение выдает это исключение:Клиент Android для WCF wshttpbinding с токеном пользователя

javax.net.ssl.SSLHandshakeException: java.security. cert.CertPathValidatorException: привязка доверия для пути сертификации не найдена.

Похоже, что это учетные данные сертификата, но я добавил учетные данные сервера в хранилище ключей, которое использует мой проект.

Это код от моего клиента:

public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    System.setProperty("http.keepAlive", "false"); 
    try { 
    /**String NAMESPACE = "http://tempuri.org/"; 
    String URL = "http://**host**/ObtenerDatos/ServicioDatos.asmx"; 
    String METHOD_NAME = "SumadorDatos"; 
    String SOAP_ACTION = "http://tempuri.org/SumadorDatos";*/ 
    String NAMESPACE = "https://tempuri.org/"; 
    String URL = "http://**host**//WCFServicio/SWObtenerDatos.svc"; 
    URL url = new URL(URL); 
    String METHOD_NAME = "MetodoEnWS"; 
    String SOAP_ACTION = "http://tempuri.org/IObtenerDatos/MetodoEnWS"; 
    SoapObject request = new SoapObject(NAMESPACE, METHOD_NAME);  
    request.addProperty("xmlPeticion","dato"); 
    SoapSerializationEnvelope envelope = new SoapSerializationEnvelope(SoapEnvelope.VER11); 
    envelope.dotNet = true; 
    envelope.setOutputSoapObject(request); 
    StrictMode.ThreadPolicy policy = new StrictMode.ThreadPolicy.Builder().permitAll().build();  
    StrictMode.setThreadPolicy(policy); 

    KeepAliveHttpsTransportSE transporte = new KeepAliveHttpsTransportSE(url.getHost(),url.getPort(),"",6000); 
    try{ 

     transporte.call(SOAP_ACTION, envelope); 

    try { 
     SoapPrimitive resultado = (SoapPrimitive)envelope.getResponse(); 
     String res = resultado.toString(); 
     TextView tv = new TextView(this); 
     tv.setText("El Resultado es: " + res);  
     setContentView(tv); 
    } catch (SoapFault e) { 
     // TODO Auto-generated catch block 
     e.printStackTrace(); 
    } 
    } catch (MalformedURLException e1) { 
     // TODO Auto-generated catch block 
     e1.printStackTrace(); 
    } 
    }catch(Exception ex){ 
     ex.printStackTrace(); 
     this.closeContextMenu(); 
    } 


} 

Второй вопрос.

Я не знаю, как отправить на сервер токен имени пользователя и пароль в голову. Должен ли я создать мыльный конверт для себя, добавляя заголовки, или существует такой метод, как .net, где я указываю значение имени пользователя и передаю его конкретным объектам?

ответ

0

Для добавления свойства в заголовок, вы должны сделать что-то вроде этого:

 Element[] header = new Element[2]; 
    header[0] = new Element().createElement(NAMESPACE, "username");     
    header[0].addChild(Node.TEXT, "Your username"); 

    header[1] = new Element().createElement(NAMESPACE, "password");     
    header[1].addChild(Node.TEXT, "Your Password"); 

    envelope.headerOut = header;         

сертификата, вы можете добавить эту строку:

HttpsURLConnection conn = (HttpsURLConnection) url.openConnection(); 
    conn.setHostnameVerifier(new HostnameVerifier() { 
     @Override 
     public boolean verify(String arg0, SSLSession arg1) { 
      return true; 
     } 
    }); 

Таким образом, вы принимаете все сертификаты