12 votes

HttpClient 4.1.1 retourne 401 lors de l'authentification avec NTLM, les navigateurs fonctionnent correctement.

Je suis en train d'essayer d'utiliser l'HttpClient 4.1.1 d'Apache/Jakarta pour me connecter à n'importe quelle page web en utilisant les identifiants donnés. Pour tester cela, j'ai une installation minimale de IIS 7.5 sur ma machine de développement où un seul mode d'authentification est actif à la fois. L'authentification de base fonctionne bien, mais Digest et NTLM renvoient des messages d'erreur 401 chaque fois que j'essaie de me connecter. Voici mon code :

    DefaultHttpClient httpclient = new DefaultHttpClient();
    HttpContext localContext = new BasicHttpContext();
    HttpGet httpget = new HttpGet("http://localhost/");
    CredentialsProvider credsProvider = new BasicCredentialsProvider();
    credsProvider.setCredentials(AuthScope.ANY,
            new NTCredentials("utilisateur", "motdepasse", "", "localhost"));
    if (!new File(System.getenv("windir") + "\\krb5.ini").exists()) {
        List authtypes = new ArrayList();
        authtypes.add(AuthPolicy.NTLM);
        authtypes.add(AuthPolicy.DIGEST);
        authtypes.add(AuthPolicy.BASIC);
        httpclient.getParams().setParameter(AuthPNames.PROXY_AUTH_PREF,
                authtypes);
        httpclient.getParams().setParameter(AuthPNames.TARGET_AUTH_PREF,
                authtypes);
    }
    localContext.setAttribute(ClientContext.CREDS_PROVIDER, credsProvider);
    HttpResponse response = httpclient.execute(httpget, localContext);
    System.out.println("Code de réponse : " + response.getStatusLine());

La seule chose que j'ai remarquée dans Fiddler est que les hachages envoyés par Firefox par rapport à ceux envoyés par HttpClient sont différents, me faisant penser que peut-être IIS 7.5 attend un hachage plus fort que celui fourni par HttpClient? Des idées? Ce serait super si je pouvais vérifier que cela fonctionnerait avec NTLM. Digest serait aussi bien, mais je peux m'en passer si nécessaire.

1voto

Jesse Points 257

J'ai enfin compris! L'authentification par hachage exige que si vous utilisez une URL complète dans la requête, le proxy doit également utiliser l'URL complète. Je n'ai pas inclus le code du proxy dans l'exemple, mais il était dirigé vers "localhost", ce qui a provoqué son échec. Le fait de changer cela en 127.0.0.1 a résolu le problème.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X