J'essaie de connecter mon application Android à un serveur IIS à l'aide de la classe httpurlConnection.
Mon serveur a besoin de l'utilisateur à authentifier. Il envoie donc le défi suivant au client: p> mon problème est que httpurlconnection ne semble pas analyser . Alors getPasswordAuthentication () n'est jamais appelé () N'appelez jamais, et il renvoie une ioexception «Aucun défi d'authentification trouvé». P> Voici mon code: P> 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) {
...
}
3 Réponses :
Je n'ai pu faire que fonctionner avec httpClient en définissant l'Authscheme et la bibliothèque ci-dessous: 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());
Remercier! Ouais, on dirait qu'il n'y a aucun moyen de le faire avec la classe HttpurlConnection actuelle. Salutations
@Nlemay J'ai une situation similaire à laquelle je dois maintenant revisiter ... Je vous authentifierez avec succès, quel en-tête doit être ajouté ou ce qui doit être fait pour "garder-vie" de cette connexion pour une session entière? J'ai écrit une question détaillée ici: Stackoverflow.com/questions/18860819/...
@whyoz Je viens de regarder votre question, mais je n'utilise pas votre bibliothèque, donc je n'ai pas d'indice. Mais avez-vous essayé la solution EPLOzADA? HttpClient est une bibliothèque généralisée, vous obtiendrez beaucoup plus d'aide pour cela. Mais je ne me suis pas essayé, je viens de décider de ne pas soutenir NTLM sur Android.
@Nlemay Ouais, finalement, je peux authentifier et obtenir le statut 200, mais comment puis-je garder cela vivant? Je pourrais authentifier avec le code d'EPLOzADA, mais cela n'ouvre pas la connexion "pour le bien". Des idées sur ce problème?
Y a-t-il une alternative pour NTLM auth-en-tête dans HTTPSURLConnection dans Android
httpurlconnection fonctionne avec NTLM à l'aide de http://jcifs.samba.org/ La bibliothèque a juste besoin de mineur ajustements tels que la suppression du code Java SMB que vous n'avez pas besoin et de la récupération de récupération. P>
Nous pouvons toujours le faire fonctionner avec HTTPSURLConnection - Définir un authentificateur et une certvalidation d'authentification (confiance en tout certificats)
package com.infosec.utils; p>
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()); } }
Un exemple en utilisant httpurlconnection et JCIFS.
Si vous trouvez une solution s'il vous plaît partager