web-dev-qa-db-fra.com

Pourquoi le client HTTP n'enverrait-il que des en-têtes d'authentification une fois qu'une demande non authentifiée a été rejetée?

L'utilisation par défaut de HttpClient et HttpWebRequest .NET classes est réglant Credentials propriété, puis demandez à l'instance de classe d'effectuer une demande HTTP. Si la cible requre BASIC Autorisation Ce qui suit se produit (ces classes le font sous le capot et le violondler montre ce qui se passe):

  • la première demande est envoyée sans Autorisation en-tête
  • le serveur décline et répond avec http 401
  • le client renvoie la même demande de la même demande avec Autorisation en-tête contenant les données correctement codées de Credentials propriété

et c'est le comportement par défaut. Donc, à moins que l'utilisateur valide sa demande et prend des mesures supplémentaires, chaque demande est envoyée deux fois - la première est universellement rejetée.

Ma question est - quelle est la raison de ce comportement par défaut? La classe client a son ensemble de propriétés Credentials afin qu'il suppose en quelque sorte que l'utilisateur souhaite utiliser ces informations d'identification pour l'authentification. Pourquoi ne pas simplement envoyer l'en-tête approprié avec la première demande? Faire ce dernier compromet au client?

9
sharptooth

Ce comportement est spécifié par RFC2617 . La raison de l'aller-retour supplémentaire est que le serveur peut demander différents types d'authentification: Basic, Digest, etc. Si vous savez à l'avance que le serveur prend une authentification de base, alors comme vous le dites, vous pouvez enregistrer un aller-retour. Mais ce n'est pas la valeur par défaut, et je pense que les bibliothèques .NET ont raison d'exposer cela comme ils le font.

21
paj28