2012-05-02 19 views
21

Ich verweise auf this link auf den Server anfordern. Das Problem ist irgendwann (nicht immer, etwa 20% - 30%, bedeutet, irgendwann kann ich eine erfolgreiche Antwort bekommen), ich habe die 401 Fehler und Serverantwort grundlegende Autorisierung Herausforderung erwartet, aber nicht gefunden.Fehler "HTTP/1.1 401 Unauthorized" mit Standardauthentifizierung in Android - EWS 2010

Hier ist mein Code:

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); 
      } 
     } 
    } 
}; 

Hier meine Authentifizierung ist:

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"); 

Aus dem Kommentar-Code können Sie sehe ich viele Möglichkeiten ausprobiert, aber der Fehler verschwinden nicht. Hier ist Logcat sagen:

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 

Also, bitte sagen Sie mir, wo ist mein Problem. Danke im Voraus.
Update: der Zielserver ist Exchange Web Service 2010. Aus irgendeinem Grund möchte ich EWS API nicht verwenden, ich habe meine eigene XML-Anforderung zum Herstellen einer Verbindung mit dem Server (diese XML-Anforderung funktioniert ordnungsgemäß).
Und hier ist die Antwort-Header vom Server Wenn Anfrage fehlgeschlagen:

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 

Wenn Anfrage Erfolg das erste Mal: ​​

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 

und das zweite Mal: ​​

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 

Die Cookie ist mein Problem, oder?

+1

Verwenden Wireshark basiert, um sicherzustellen, es zu senden, was Sie erwarten. –

+0

Danke, ich benutze SoapUI, um die Anfrage zu machen, es funktioniert immer, aber ich weiß nicht, warum das immer noch Fehler – R4j

+0

Gibt es Proxy-Server zwischen Ihrer App sitzt (wenn Sie es auf Emulator ausführen, bezieht sich auf den tatsächlichen Computer Emulator) und der Zielserver? – yorkw

Antwort

11

Ich hatte letzte Woche Schwierigkeiten mit Android HTTP basic. Ich habe versucht, vielleicht 3 oder 4 verschiedene Möglichkeiten, es zu tun und immer habe ich ein Problem gefunden. Im Moment war der einzige Weg, wie ich es geschafft habe, der einfachste Weg.

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

Das funktionierte für mich mit AndroidHttpClient.

Edit:

Dies ist meine vollständigen Quellcode

https://gist.github.com/2642692

Es auf http://lukencode.com/2010/04/27/calling-web-services-in-android-using-httpclient/

+0

Können Sie Ihren vollständigen Quellcode posten, um eine Anfrage zu stellen? – R4j

+0

Ich habe den Quellcode der Klasse hinzugefügt, die ich verwende. – Axxiss

+0

Schlägst du eine NTLM-Authentifizierung vor? Weil ich diesen Fehler bekomme: "Authentifizierungsschema ntlm nicht unterstützt" Authentifizierungsfehler: Kann auf keine dieser Herausforderungen antworten: {ntlm = WWW-Authenticate: NTLM, verhandeln = WWW-Authenticate: Negotiate} – R4j