bearer authenticator auth java android basic-authentication exchangewebservices

java - authenticator - Error "HTTP/1.1 401 no autorizado" con autenticación básica en Android-EWS 2010



authentication interceptor android (1)

Me refiero a este enlace para solicitar al servidor. El problema es en algún momento (no siempre, alrededor del 20% - 30%, significa que en algún momento puedo obtener una respuesta exitosa), obtuve el 401 error y el desafío de autorización básica de respuesta del servidor esperado, pero no se encontró .

Aquí está mi código:

HttpRequestInterceptor preemptiveAuth = new HttpRequestInterceptor() { public void process(final HttpRequest request, final HttpContext context) throws HttpException, IOException { AuthState authState = (AuthState) context .getAttribute(ClientContext.TARGET_AUTH_STATE); CredentialsProvider credsProvider = (CredentialsProvider) context .getAttribute(ClientContext.CREDS_PROVIDER); HttpHost targetHost = (HttpHost) context .getAttribute(ExecutionContext.HTTP_TARGET_HOST); if (authState.getAuthScheme() == null) { AuthScope authScope = new AuthScope(targetHost.getHostName(), targetHost.getPort()); Credentials creds = credsProvider.getCredentials(authScope); if (creds != null) { authState.setAuthScheme(new BasicScheme()); authState.setCredentials(creds); } } } };

Aquí está mi autenticación:

HttpPost httpPost = new HttpPost(SERVER_AUTH_URL); httpPost.setHeader("Content-type", "text/xml; charset=utf-8"); httpPost.setHeader("Keep-Alive", "300"); httpPost.setHeader("Connection", "Keep-Alive"); StringEntity se = new StringEntity(myRequest, "UTF-8"); httpPost.setEntity(se); se.setContentType("text/xml"); se.setContentEncoding("gzip,deflate"); //add preemptiveAuth client.addRequestInterceptor(preemptiveAuth, 0); //Set the proxy ProxySelectorRoutePlanner routePlanner = new ProxySelectorRoutePlanner( client.getConnectionManager().getSchemeRegistry(), ProxySelector.getDefault()); client.setRoutePlanner(routePlanner); List<String> authPrefs = new ArrayList<String>(); authPrefs.add(AuthPolicy.BASIC); authPrefs.add(AuthPolicy.NTLM); authPrefs.add(AuthPolicy.DIGEST); client.getParams().setParameter("http.auth.scheme-priority", authPrefs); CredentialsProvider credProvider = new BasicCredentialsProvider(); // client.getParams().setParameter("http.auth.scheme-priority", // authPrefs); credProvider.setCredentials(AuthScope.ANY, new NTCredentials(getUsername(), getPassword(), "", getDomain())); Log.d(TAG, "repair excute"); client.setCredentialsProvider(credProvider); HttpResponse response = client.execute(httpPost); Log.d(TAG, "has excute");

En el código de comentario, puedes ver que intenté de muchas maneras, pero el error no desapareció. Aquí está logcat decir:

05-02 10:28:21.724: D/dalvikvm(1169): GC_FOR_MALLOC freed 11259 objects / 457352 bytes in 43ms 05-02 10:28:22.384: D/MainActivity(1169): repair excute 05-02 10:28:22.744: D/dalvikvm(1169): GC_FOR_MALLOC freed 11481 objects / 447264 bytes in 67ms 05-02 10:28:22.894: D/dalvikvm(1169): GC_FOR_MALLOC freed 1078 objects / 83928 bytes in 76ms 05-02 10:28:22.894: I/dalvikvm-heap(1169): Grow heap (frag case) to 3.833MB for 87396-byte allocation 05-02 10:28:23.034: D/dalvikvm(1169): GC_FOR_MALLOC freed 58 objects / 3336 bytes in 143ms 05-02 10:28:23.124: W/DefaultRequestDirector(1169): Authentication error: basic authorization challenge expected, but not found 05-02 10:28:23.124: D/MainActivity(1169): has excute 05-02 10:28:23.124: E/MainActivity(1169): response error: HTTP/1.1 401 Unauthorized

Entonces, por favor dime dónde está mi problema. Gracias por adelantado.
Actualización : el servidor de destino es Exchange Web Service 2010. Por alguna razón, no quiero usar la API de EWS, hice mi propia solicitud xml para conectarme al servidor (esta solicitud xml funciona correctamente).
Y aquí está el encabezado de respuesta del servidor cuando la solicitud falló:

Server Microsoft-IIS/7.5 WWW-Authenticate Negotiate WWW-Authenticate NTLM X-Powered-By ASP.NET Date Fri, 25 May 2012 03:47:57 GMT Content-Length 0

Cuando solicite éxito la primera vez:

Cache-Control private Transfer-Encoding chunked Content-Type text/xml; charset=utf-8 Server Microsoft-IIS/7.5 Set-Cookie exchangecookie=1d9d9b1d21064035ad375c8aecde2168; expires=Sat, 25-May-2013 04:00:46 GMT; path=/; HttpOnly X-AspNet-Version 2.0.50727 X-Powered-By ASP.NET Date Fri, 25 May 2012 04:00:45 GMT

y la segunda vez:

Cache-Control private Transfer-Encoding chunked Content-Type text/xml; charset=utf-8 Server Microsoft-IIS/7.5 X-EwsPerformanceData RpcC=4;RpcL=0;LdapC=0;LdapL=0; X-AspNet-Version 2.0.50727 X-Powered-By ASP.NET Date Fri, 25 May 2012 04:00:47 GMT

La galleta es mi problema, ¿no?


Estaba luchando con Android HTTP básico la semana pasada. He intentado tal vez 3 o 4 formas diferentes de hacerlo y siempre he encontrado algún problema. En este momento, la única forma en que logré que funcionara era la forma más sencilla.

UsernamePasswordCredentials credentials = new UsernamePasswordCredentials(user, pass); Header header = new BasicScheme().authenticate(credentials, mHttpRequest); mHttpRequest.addHeader(header);

Eso me funcionó con AndroidHttpClient.

Editar:

Este es mi código fuente completo

https://gist.github.com/2642692

Se basa en http://lukencode.com/2010/04/27/calling-web-services-in-android-using-httpclient/