web-dev-qa-db-ja.com

認証されていないリクエストが拒否された後、HTTPクライアントが認証ヘッダーを送信するのはなぜですか?

HttpClientおよびHttpWebRequest .NETクラスのデフォルトの使用法は、Credentialsプロパティを設定し、クラスインスタンスにHTTPリクエストを実行するように要求することです。ターゲットがBasic承認を必要とする場合、次のことが起こります(これらのクラスは内部でこれを行い、Fiddlerは何が起こっているかを示します)。

  • 最初のリクエストはAuthorizationヘッダーなしで送信されます
  • サーバーが拒否し、HTTP 401で応答する
  • クライアントは、今回はまったく同じ要求を、Credentialsプロパティから適切にエンコードされたデータを含むAuthorizationヘッダーで再送信します

これがデフォルトの動作です。したがって、ユーザーがアプリケーションを検証して追加の手順を実行しない限り、すべてのリクエストは2回送信されます-最初のリクエストは一般的に拒否されます。

私の質問は-そのようなデフォルトの動作の理由は何ですか?クライアントクラスにはCredentialsプロパティが設定されているため、ユーザーがこれらの資格情報を認証に使用することを想定しています。最初のリクエストで適切なヘッダーを送信しないのはなぜですか?後者を実行すると、どういうわけかクライアントが危険にさらされますか?

9
sharptooth

この動作は RFC2617 で指定されます。追加の往復の理由は、サーバーが基本認証、ダイジェスト認証など、さまざまな種類の認証を要求できるためです。サーバーが基本認証を行うことが事前にわかっている場合は、言うまでもなく、往復を節約できます。しかし、それはデフォルトではありません。NETライブラリは、これを公開するのと同じように正しいと思います。

21
paj28