ブラウザーでは、HTTP と NTLM 認証プロトコルの性質上、この状況を回避するためにできることはあまりありません。
ただし、ファイルのデータ全体が実際に 2 回送信されているとは思いません。
IIS 7.5 の NTLM で保護されたファイルに次を送信しました。
POST /test/upload HTTP/1.1
Host: localhost
Content-Length: 5
実際にはコンテンツを送信せず、完全なヘッダーのみを送信したことに注意してください。しかし、IISはすぐに次のように応答しました。
HTTP/1.1 401 Unauthorized
Cache-Control: private
Content-Type: text/html; charset=utf-8
Server: Microsoft-IIS/7.5
WWW-Authenticate: Negotiate
WWW-Authenticate: NTLM
Date: Thu, 10 Jan 2013 05:17:58 GMT
Content-Length: 6277
...
これは、大きなファイルをアップロードするブラウザの場合、非常に多くのバイトを転送する前に切断されることを意味します。私は、行儀の良いブラウザーならファイルのアップロードをあきらめて、HTTP 認証を開始すると思います (希望します)。
Wireshark のようなものを取り出して、実際にネットワーク上で何が起こっているかを確認するのは時間の価値があるかもしれません。(異なるブラウザーでテストすることを忘れないでください!) ブラウザー内の開発者ツールを信頼しないでください。また、Fiddler のようなデバッグ プロキシを使用しないでください。(実際、Fiddler を使用している場合、それが実際に問題になる可能性があります。サーバーに何かを送信する前に、要求全体をバッファーに入れます。)
ファイル全体が実際に 2 回アップロードされていることがわかった場合 (IIS の古いバージョンでは即時に送信されない可能性があり401
ます)、どのように処理が行われる必要があるかを検討してください。
ユーザーがアップロードを送信すると、ブラウザーがPOST
サーバーに要求を発行します。URL に認証が必要かどうかをブラウザーが認識できないため、ブラウザーは完全な要求を送信するだけです。
POST /upload HTTP/1.1
Content-Type: mutlipart/form-data
Content-Length: 1024
...
サーバーはすぐに で応答するかもしれません401
が、動作の悪いユーザー エージェントはとにかく要求全体を送信しようとします。
要求が完了し、ブラウザが を確認したら、NTLM ダンス401
を開始します。クライアントは、タイプ 1メッセージを含む新しいリクエストを発行する必要があります。サーバーは、今回はタイプ 2 メッセージを含む別の で応答し、最後にクライアントは、実際の資格情報を含むタイプ 3 メッセージを含む 3番目のリクエストを発行します。401
クライアントは、NTLM ネゴシエーションで 2 番目の要求が別の要求であることが保証されて401
いることを知っているため、エンティティ (フォーム データ) の送信をスキップできることを認識しています。ただし、サーバーが元の要求データを破棄したと想定する必要があるため、3 番目の要求で再度ポスト データを送信する必要があります。
私たちのファイルがついにアップロードされました!(ただし、2回送信する必要がありました。)
そのため、NTLM 認証で二重アップロードの問題が完全に発生することはないと思いますが、それでも可能性を排除したい場合があります。これが私がそれに取り組む方法です:
アップロード URLを NTLM 認証領域の外に移動します。アップロード ページ (NTLM 認証済み) で、セッション Cookie (ページの読み込み時に設定) を使用するか、トークンを発行します。隠しフィールドの GUID で十分です。
アップロードを受信したスクリプトは、有効なセッションやトークンを持たないリクエストを拒否できます。
NTFS リソースへのアクセスを許可するメカニズムとして NTLM 資格情報を使用している場合、アップロードは匿名で書き込み可能な一時フォルダーに書き込まれる可能性があり、完了したら、ファイルを移動する 2 番目の NTLM 保護スクリプトに要求をリダイレクトします。その目的地。