Android-клиент для WCF wshttpbinding с токеном имени пользователя
Я пытаюсь развернуть клиент Android 3.0 для WSF-безопасности WCF. WCF WS реализует маркер имени пользователя в качестве безопасного доступа. Я использую KSOAP2, и у меня нет проблем с доступом к службе asmx, но когда я пытаюсь сделать вызов WSF WS, приложение выдает это исключение:
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, где я задаю значение имени пользователя и передаю его конкретным объектам?
1 ответ
Для добавления свойства в заголовок вы должны сделать что-то вроде этого:
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;
}
});
Таким образом, вы принимаете все сертификаты