2013-06-18 3 views
7

Я пытаюсь подключить свое приложение Android к серверу IIS с использованием класса HttpUrlConnection.HttpUrlConnection не находит вызов NTLM на Android

Мой сервер требует, чтобы пользователь аутентификации, поэтому он посылает следующий вызов клиенту:

WWW-Authenticate: Negotiate 
WWW-Authenticate: NTLM 

Моя проблема заключается в том, что HttpURLConnection не кажется, чтобы разобрать его. Таким образом, getPasswordAuthentication() никогда не вызывает вызов, и он возвращает исключение IOException «не обнаруженные проверки подлинности».

Вот мой код:

Authenticator.setDefault(new Authenticator() { 
    @Override 
    protected PasswordAuthentication getPasswordAuthentication() {     

      return new PasswordAuthentication("myUsername", "myPassword".toCharArray()); 
    }    
}); 

URL url = new URL(myUrl);    
HttpURLConnection conn = (HttpURLConnection) url.openConnection();   

conn.setRequestMethod("GET"); 
conn.setRequestProperty("Accept-Encoding", "gzip"); 
conn.setRequestProperty("Accept-Charset", "UTF-8");   
conn.setRequestProperty("Accept", "*/*"); 
conn.setRequestProperty("Connection", "close"); 
conn.setDoOutput(true); 
conn.setDoInput(true);   

try 
{ 
    conn.connect();    
    status_code = conn.getResponseCode(); 
}catch (IOException e) { 
    ...    
} 

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

Может кто-нибудь подтвердить, возможно ли или нет, чтобы HttpUrlConnection обрабатывал вызов NTLM без внешних библиотек?

+0

[пример] (http://stackoverflow.com/a/34321230/2073804) с использованием HttpURLConnection и jcifs. – ron190

+0

Если вы нашли какое-либо решение, пожалуйста, shrare – Sarry

ответ

3

Я только смог заставить его работать с HttpClient, установив AuthScheme и библиотеку ниже: http://jcifs.samba.org/src/jcifs-krb5-1.3.17.zip.

HttpClient httpclient = new HttpClient(httpParameters, context); 
NTCredentials creds = new NTCredentials(“username”, “password”, "", "dir"); 
httpclient.getCredentialsProvider().setCredentials(
       new AuthScope(context.getString(“whatever is your main URL”), -1), creds); 
httpclient.getAuthSchemes().register("ntlm", new NTLMSchemeFactory()); 

Затем вы реализуете двигатель JCIFS и завод. Вы можете найти образцы в http://hc.apache.org/httpcomponents-client-4.2.x/ntlm.html

+0

Спасибо! Да, похоже, что нет никакого способа сделать это с текущим классом HttpURLConnection. С уважением – NLemay

+0

@NLemay У меня есть аналогичная ситуация, и теперь мне нужно пересмотреть ... если вы успешно аутентифицируете, какой заголовок должен быть добавлен или что нужно сделать, чтобы «поддерживать» это соединение для целого сеанса? Я написал подробный вопрос здесь: http://stackoverflow.com/questions/18860819/android-ntlm-authentication-ksoap-and-persistent-connections – whyoz

+0

@whyoz Я просто посмотрел на ваш вопрос, но я не использую вашу библиотеку поэтому у меня нет подсказки. Но вы пробовали решение eplozada? HttpClient - широко распространенная библиотека, вам будет гораздо больше помогать. Но я на самом деле не пробовал себя, я просто решил не поддерживать NTLM на Android. – NLemay

1

HttpUrlConnection работает с NTLM, используя http://jcifs.samba.org/. Библиотека просто нуждается в небольших настройках, таких как удаление smb-кода java, который вам либо не нужен, и исправление кода responseCode.

2

Мы можем все еще заставить его работать с HttpsURLConnection - Определить Authenticator и перепускной Certvalidation (Доверяя все CERTS)

пакет com.infosec.utils;

import java.io.BufferedReader; 
import java.io.InputStream; 
import java.io.InputStreamReader; 
import java.net.Authenticator; 
import java.net.CookieHandler; 
import java.net.CookieManager; 
import java.net.CookiePolicy; 
import java.net.PasswordAuthentication; 
import java.net.URL; 
import java.net.URLConnection; 
import java.security.SecureRandom; 
import java.security.cert.X509Certificate; 

import javax.net.ssl.HttpsURLConnection; 
import javax.net.ssl.SSLContext; 
import javax.net.ssl.SSLSocketFactory; 
import javax.net.ssl.TrustManager; 
import javax.net.ssl.X509TrustManager; 

public class SSLConnect { 

     public static void main(String[] args) throws Exception { 

      String urlString = System.getProperty("url", "https://yourURLgoesHere:8443/test?"); 
      CookieHandler.setDefault(new CookieManager(null, CookiePolicy.ACCEPT_ALL)); 
      Authenticator.setDefault(new MyAuthenticator("domainname\\yourname", "yourpassword")); 


      URL url = new URL(urlString); 
      URLConnection urlConnection = url.openConnection(); 
      HttpsURLConnection httpsUrlConnection = (HttpsURLConnection) urlConnection; 
      SSLSocketFactory sslSocketFactory = createTrustAllSslSocketFactory(); 
      httpsUrlConnection.setSSLSocketFactory(sslSocketFactory); 


      try (InputStream inputStream = httpsUrlConnection.getInputStream()) { 
       BufferedReader reader = new BufferedReader(new InputStreamReader(inputStream)); 
       String line = null; 
       while ((line = reader.readLine()) != null) { 
       // if you want to print the content 
        System.out.println(line); 

       } 
      } 
     } 

     // Trust any Server that provides the SSL certificate by bypassing trust managers 

     private static SSLSocketFactory createTrustAllSslSocketFactory() throws Exception { 
      TrustManager[] byPassTrustManagers = new TrustManager[] { new X509TrustManager() { 
       public X509Certificate[] getAcceptedIssuers() { 
        return new X509Certificate[0]; 
       } 

       public void checkClientTrusted(X509Certificate[] chain, String authType) { 
       } 

       public void checkServerTrusted(X509Certificate[] chain, String authType) { 
       } 
      } }; 
      SSLContext sslContext = SSLContext.getInstance("TLS"); 
      sslContext.init(null, byPassTrustManagers, new SecureRandom()); 
      return sslContext.getSocketFactory(); 
     } 

} 

// Authenticator which intercepts and provide required credential 

class MyAuthenticator extends Authenticator { 
    private String httpUsername; 
    private String httpPassword; 

    public MyAuthenticator(String httpUsername, String httpPassword) { 
     this.httpUsername = httpUsername; 
     this.httpPassword = httpPassword; 
    } 

    @Override 
    protected PasswordAuthentication getPasswordAuthentication() { 
     System.out.println("Scheme:" + getRequestingScheme()); 
     return new PasswordAuthentication(httpUsername, httpPassword.toCharArray()); 
    } 
} 
+0

Не работает, пожалуйста, поделитесь, если найдёте какие-либо решения – Sarry

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

  • Нет связанных вопросов^_^