0

少しクレイジーな問題があります。POST経由でフォーミュラーを投稿する必要があるIIS7があります。また、NTLM経由で認証する必要があり、SSL接続を介してこれらすべてのものを認証する必要があります。これまでのところ、サーバーに接続してデータを投稿することができました。

POST の後、2 番目のページにリダイレクトされる 302 応答が成功します。DefaultHttpClient は Web サーバーに接続して認証を行い、データを送信します。これまでのところ、すべてが機能します。しかし、クライアントは接続を閉じて2番目の接続を開きます(この動作は私を悩ませています)が、これは私の問題ではありません。2 番目の接続で、クライアントは IIS での認証方法を忘れ、401 認証エラーで中断します。

これまでのところ、これはDefaultHttpClientのソースで修正されたバグであることがわかりますが、Android はこのライブラリの古いバージョンを使用しているようです。世界中のすべての Android デバイスにあると思われるバグを修正するにはどうすればよいですか?

これが私のコミュニケーションの関連部分です:

POST /login/ HTTP/1.1
Content-Length: 21
Content-Type: application/x-www-form-urlencoded
Host: example.com
Connection: Keep-Alive
Cookie: ASPSESSION...

[the post data]

HTTP/1.1 401 Unauthorized
Content-Type: text/html
Server: Microsoft-IIS/7.5
WWW-Authenticate: NTLM
Content-Length: 1344

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
...
</html>

POST /login/ HTTP/1.1
Content-Length: 21
Content-Type: application/x-www-form-urlencoded
Host: example.com
Connection: Keep-Alive
Cookie: ASPSESSION...
Authorization: NTLM ABC...==

[the post data]

HTTP/1.1 401 Unauthorized
Content-Type: text/html; charset=us-ascii
Server: Microsoft-HTTPAPI/2.0
WWW-Authenticate: NTLM ABC...DEF
Content-Length: 341

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN""http://www.w3.org/TR/html4/strict.dtd">
<HTML><HEAD><TITLE>Not Authorized</TITLE>...</HTML>

POST /login/ HTTP/1.1
Content-Length: 21
Content-Type: application/x-www-form-urlencoded
Host: example.com
Connection: Keep-Alive
Cookie: ASPSESSION...
Authorization: NTLM ABC...DEF

[the post data]

HTTP/1.1 302 Moved Temporary
Cache-Control: private,no-cache
Pragma: no-cache
Content-Length: 31
Content-Type: application/json; Charset=UTF-8
Expires: Fri, 07 Dec 2012 07:01:00 GMT
Location: /login/step2.asp
Server: Microsoft-IIS/7.5
Set-Cookie: [...] path=/login/; HttpOnly;
Persistent-Auth: true

[some response]

--- 接続が閉じられ、2 番目の https 接続が開かれます ---

GET /login/step2.asp HTTP/1.1
Host: example.com
Connection: Keep-Alive
Cookie: ASPSESSION...


HTTP/1.1 401 Unauthorized
Content-Type: text/html
Server: Microsoft-IIS/7.5
WWW-Authenticate: NTLM
Content-Length: 1344

--- そして接続が再び閉じます ---

それを修正する方法を知っていますか?

4

2 に答える 2

1

の新しいバージョンのライブラリを取得しDefaultHttpClientて、プロジェクトに含めてみませんか?

于 2012-12-17T08:28:26.297 に答える
0

これは私の問題の単なる回避策ではありませんが、これは役立つかもしれません。自分でリダイレクトを処理するcreateClientRequestDirector関数をオーバーライドします。DefaultHttpClient

接続が閉じられる原因は、ホスト名で遊んでいるため、ホスト名ではなく IP に接続することです。その結果、ソース URL と宛先 URL を比較することで接続を再利用できるかどうか、リダイレクト中にクライアントが確認します。そのため、どちらが失敗https://www.example.com/https://127.0.0.1/たかを比較して、接続を閉じます。

私の解決策は、この部分を自分でチェックすることです。ホスト名と IP が一致する場合は、最後に使用した IP を返します。その結果、接続を再利用できるようになり、上記のリンクのバグは発生しません。

于 2012-12-17T12:11:13.200 に答える