12

Apache/Jakarta HttpClient 4.1.1 を使用して、指定された資格情報を使用して任意の Web ページに接続しようとしています。これをテストするために、一度に 1 つの認証モードのみがアクティブな開発マシンに IIS 7.5 の最小限のインストールを行いました。基本認証は正常に機能しますが、ログインしようとするとダイジェストと NTLM が 401 エラー メッセージを返します。コードは次のとおりです。

    DefaultHttpClient httpclient = new DefaultHttpClient();
    HttpContext localContext = new BasicHttpContext();
    HttpGet httpget = new HttpGet("http://localhost/"); 
    CredentialsProvider credsProvider = new BasicCredentialsProvider();
    credsProvider.setCredentials(AuthScope.ANY,
            new NTCredentials("user", "password", "", "localhost"));
    if (!new File(System.getenv("windir") + "\\krb5.ini").exists()) {
        List<String> authtypes = new ArrayList<String>();
        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("Response code: " + response.getStatusLine());

Fiddler で気づいたことの 1 つは、Firefox から送信されるハッシュと HttpClient から送信されるハッシュが異なることです。おそらく、IIS 7.5 は HttpClient が提供するよりも強力なハッシュを期待しているのではないでしょうか? 何か案は?これが NTLM で動作することを確認できれば幸いです。ダイジェストもあればいいのですが、必要に応じてダイジェストがなくても生活できます。

4

6 に答える 6

6

HttpClient4.1.X でも同じ問題がありました。HttpClient 4.2.6 にアップグレードした後、魅力的に目覚めました。以下は私のコードです

DefaultHttpClient httpclient = new DefaultHttpClient();
        HttpContext localContext = new BasicHttpContext();
        HttpGet httpget = new HttpGet("url"); 
        CredentialsProvider credsProvider = new BasicCredentialsProvider();
        credsProvider.setCredentials(AuthScope.ANY,
                new NTCredentials("username", "pwd", "", "domain"));
                    List<String> authtypes = new ArrayList<String>();
            authtypes.add(AuthPolicy.NTLM);      
            httpclient.getParams().setParameter(AuthPNames.TARGET_AUTH_PREF,authtypes);

        localContext.setAttribute(ClientContext.CREDS_PROVIDER, credsProvider);
        HttpResponse response = httpclient.execute(httpget, localContext);
        HttpEntity entity=response.getEntity();
于 2013-11-18T12:31:24.330 に答える
4

私が見つけたこのような状況をトラブルシューティングする最も簡単な方法はWiresharkです。とても大きなハンマーですが、本当にすべてを見せてくれます。それをインストールし、サーバーが別のマシン上にあることを確認して (Localhost では動作しません)、ログを開始します。

失敗したリクエストを実行し、機能するリクエストを実行します。次に、http でフィルター処理し (フィルター フィールドに http を入力するだけです)、最初の GET 要求を見つけ、他の GET 要求を見つけて比較します。意味のある違いを特定します。これで、コード/ネットを検索する特定のキーワードまたは問題が得られました。不十分な場合は、最初の TCP 会話に絞り込み、完全な要求/応答を調べます。他のものと同じです。

私はそのアプローチで信じられないほど多くの問題を解決しました。また、Wireshark は知っておくと非常に便利なツールです。ネットワークのデバッグを容易にするための非常に高度な機能がたくさんあります。

クライアント側またはサーバー側で実行することもできます。比較できるように両方の要求を表示するものは何でも。

于 2011-05-10T20:43:54.590 に答える
2

httpcomponents-client-4.5.1 の jar を使用するようにアプリケーションを更新すると、この問題が解決されました。

于 2016-04-22T20:12:49.457 に答える
1

私はついにそれを理解しました。ダイジェスト認証では、要求で完全な URL を使用する場合、プロキシも完全な URL を使用する必要があります。サンプルにプロキシ コードを残していませんでしたが、「localhost」にリダイレクトされたため、失敗しました。これを 127.0.0.1 に変更すると機能しました。

于 2011-05-25T20:48:11.497 に答える