1

1 つの HttpClient (1 セッション) でターゲット サーバーに複数のリクエストを送信しようとします。ターゲット サーバーは、最初にすべての要求をダイジェスト認証 (MD5-sess に基づく) で認証します。結果は、最初のアクセスのみが成功したことを示しています。"nc" 値は常に "00000001" であるため、サーバーはその後のアクセスをリプレイ攻撃として処理するため、次のアクセスはサーバーによって拒否されます。

Android HttpClient は、ダイジェスト承認ヘッダーの属性「nc」を「00000001」にハードコーディングしているようです。

新しいリクエストが送信されたときにクライアントがこの値を増やす方法はありますか? ありがとう。

パブリック クラス HttpService {

private static final HttpService instance = new HttpService();
private HttpService() {
    client = getHttpClient();
}

public static HttpService getInstance() {
    return instance;
}

private DefaultHttpClient getHttpClient() {
    HttpParams params = new BasicHttpParams();
    HttpConnectionParams.setStaleCheckingEnabled(params, false);
    HttpConnectionParams.setConnectionTimeout(params, 15 * 1000);
    HttpConnectionParams.setSoTimeout(params, 15 * 1000);
    HttpConnectionParams.setSocketBufferSize(params, 8192);
    HttpProtocolParams.setUserAgent(params, USER_AGENT);

    SchemeRegistry schemeRegistry = new SchemeRegistry();
    Scheme httpScheme = new Scheme("http", PlainSocketFactory.getSocketFactory(), 80);
    Scheme httpsScheme = new Scheme("https", SSLCertificateSocketFactory.getHttpSocketFactory(30 * 1000, null), 443);
    schemeRegistry.register(httpScheme);
    schemeRegistry.register(httpsScheme);
    ClientConnectionManager manager = new ThreadSafeClientConnManager(params, schemeRegistry);

    //create client
    DefaultHttpClient httpClient = new DefaultHttpClient(manager, params);

    httpClient.getCredentialsProvider().setCredentials(new AuthScope(address, port),
                new UsernamePasswordCredentials(username, password));
}

}

4

2 に答える 2

0

あなたは正しいようです。これはからDigest.javaです:

//TODO: supply a real nonce-count, currently a server will interprete a repeated request as a replay
private static final String NC = "00000001"; //nonce-count is always 1

http://b.android.comでバグを報告する必要があります。いくつかのオプションがあります。

  • ダイジェストを計算してヘッダーを自分で作成し、すべてのリクエストに設定します。これを認証するためにを追加できますHttpRequestInterceptor(資格情報を資格情報プロバイダーに設定しないでください)
  • AFAIK認証スキームはプラグ可能である必要があるため、ダイジェスト認証を適切に実装し、それを使用するようにクライアントを構成します。
  • 別のHTTPクライアントライブラリを使用します。

編集:それはストックバージョンで修正されているので、別の選択肢があります:

別の選択肢:

  • jarjarを使用してApacheHttpClientパッケージ名を変更し、アプリと一緒にパッケージ化します。Androidシステムはまったく使用しないでください。
于 2012-03-23T08:51:30.250 に答える