Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

Le trafic engendré par l'appel à un web service est doublé - Credentials ?

6 réponses
Avatar
Gilbert Tordeur
Bonjour.

Contexte = VB2008.

J'ai écrit un web service que j'ai installé sur un serveur Intranet IIS. Ce
site web requiert une authentification Windows intégrée. J'ai aussi écrit
une application WinForm qui tourne sur mon PC (lancement du débogage par VS
2008) et qui appelle ce service. Le tout semble fonctionner correctement.

J'ai installé WireShark sur mon PC pour examiner le traffic et là surprise !
La requête du PC vers le serveur est envoyée une première fois et reçoit une
erreur 401. Le PC envoie à nouveau la requête, en ajoutant une ligne
«Authorization: Negotiate» suivie d'une longue chaîne hexa, et là il reçoit
la réponse.

Est-ce normal (j'ai des doutes) ou est-ce dû à une mauvaise programmation de
ma part (par exemple à la ligne MonService.Credentials =
System.Net.CredentialCache.DefaultCredentials)?

Merci d'avance,
Gilbert

===============

Source du service (simplifiée) :

<System.Web.Services.WebService(Namespace:="http://franceintranet.cg.eu.jci.com/")>
_
<System.Web.Services.WebServiceBinding(ConformsTo:=WsiProfiles.BasicProfile1_1)>
_
<ToolboxItem(False)> _
Public Class CjwCs
Inherits System.Web.Services.WebService

Private Const MessagePrefixe As String = "CjwCsException : "

<WebMethod()> _
Public Function GetErrorMessagePrefix() As String
Return MessagePrefixe
End Function

End Class

==========================

Source du programme Web appelant :

' Identifier le service Web
Dim MonService = New SerCsProd.CjwCs
' Spécifier le type d'authentification de l'utilisateur
MonService.Credentials =
System.Net.CredentialCache.DefaultCredentials

' Demander le préfixe des messages d'erreur
Dim PrefixeMessageErreur As String =
MonService.GetErrorMessagePrefix

===========================

Premier «Follow TCP Stream» de Wireshark :

POST /InfCnx000/CjwCs.asmx HTTP/1.1
User-Agent: Mozilla/4.0 (compatible; MSIE 6.0; MS Web Services Client
Protocol 2.0.50727.3082)
VsDebuggerCausalityData:
uIDPo427pQWkv3xJjC8otv4LQ4oAAAAAsURX6zg99E69sht9YSfs/FED9f5LuAhAu1hXD9DPOJ4ACQAA
Content-Type: text/xml; charset=utf-8
SOAPAction: "http://franceintranet.cg.eu.jci.com/GetErrorMessagePrefix"
Host: franceintranet.cg.eu.jci.com
Content-Length: 316
Expect: 100-continue
Connection: Keep-Alive

---HTTP/1.1 401 UnauthorizedContent-Length: 1656Content-Type:
text/htmlServer: Microsoft-IIS/6.0WWW-Authenticate:
NegotiateWWW-Authenticate: NTLMMicrosoftOfficeWebServer:
5.0_PubX-Powered-By: ASP.NETDate: Thu, 13 Aug 2009 16:29:56 GMT<!DOCTYPE
HTML PUBLIC "-//W3C//DTD HTML 4.01//EN"
"http://www.w3.org/TR/html4/strict.dtd"><HTML><HEAD><TITLE>You are not
authorized to view this page</TITLE><META HTTP-EQUIV="Content-Type"
Content="text/html; charset=Windows-1252"><STYLE type="text/css"> BODY {
font: 8pt/12pt verdana } H1 { font: 13pt/15pt verdana } H2 { font:
8pt/12pt verdana } A:link { color: red } A:visited { color:
maroon }</STYLE></HEAD><BODY><TABLE width=500 border=0
cellspacing=10><TR><TD><h1>You are not authorized to view this page</h1>You
do not have permission to view this directory or page using the credentials
that you supplied because your Web browser is sending a WWW-Authenticate
header field that the Web server is not configured to accept.<hr><p>Please
try the following:</p><ul><li>Contact the Web site administrator if you
believe you should be able to view this directory or page.</li><li>Click the
<a href="javascript:location.reload()">Refresh</a> button to try again with
different credentials.</li></ul><h2>HTTP Error 401.2 - Unauthorized: Access
is denied due to server configuration.<br>Internet Information Services
(IIS)</h2><hr><p>Technical Information (for support personnel)</p><ul><li>Go
to <a href="http://go.microsoft.com/fwlink/?linkid=8180">Microsoft Product
Support Services</a> and perform a title search for the words <b>HTTP</b>
and <b>401</b>.</li><li>Open <b>IIS Help</b>, which is accessible in IIS
Manager (inetmgr), and search for topics titled <b>About Security</b>,
<b>Authentication</b>, and <b>About Custom Error
Messages</b>.</li></ul></TD></TR></TABLE></BODY></HTML>

Second «Follow TCP Stream» de Wireshark :

POST /InfCnx000/CjwCs.asmx HTTP/1.1User-Agent: Mozilla/4.0 (compatible; MSIE
6.0; MS Web Services Client Protocol 2.0.50727.3082)VsDebuggerCausalityData:
uIDPo72uSbitAu1AmMAY60lPfugAAAAAAMMS90I7QU2EdFlJgUC080Lndxq1KQROpvn1eK4fSZoACQAAContent-Type:
text/xml; charset=utf-8SOAPAction:
"http://franceintranet.cg.eu.jci.com/GetErrorMessagePrefix"Authorization:
Negotiate
(contenu binaire effacé...)Host: franceintranet.cg.eu.jci.comContent-Length:
316Expect: 100-continueHTTP/1.1 100 Continue<?xml version="1.0"
encoding="utf-8"?><soap:Envelope
xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:xsd="http://www.w3.org/2001/XMLSchema"><soap:Body><GetErrorMessagePrefix
xmlns="http://franceintranet.cg.eu.jci.com/"
/></soap:Body></soap:Envelope>HTTP/1.1 200 OKDate: Fri, 14 Aug 2009 08:37:42
GMTServer: Microsoft-IIS/6.0MicrosoftOfficeWebServer: 5.0_PubX-Powered-By:
ASP.NETWWW-Authenticate: Negotiate
oYGgMIGdoAMKAQChCwYJKoZIgvcSAQICooGIBIGFYIGCBgkqhkiG9xIBAgICAG9zMHGgAwIBBaEDAgEPomUwY6ADAgEXolwEWqq9r5MFhOM7pSxoOluGTRT1zgLNDeRRPZq1sTfWKw6sGETRdsfGPY/51y/uYQl2ao8RX6xz79G7gjPemBYtJQEmyacHDMOadkUBzaOd314yuicZut9K+Vff3w==X-AspNet-Version:
2.0.50727Cache-Control: private, max-age=0Content-Type: text/xml;
charset=utf-8Content-Length: 430<?xml version="1.0"
encoding="utf-8"?><soap:Envelope
xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:xsd="http://www.w3.org/2001/XMLSchema"><soap:Body><GetErrorMessagePrefixResponse
xmlns="http://franceintranet.cg.eu.jci.com/"><GetErrorMessagePrefixResult>CjwCsException
:
</GetErrorMessagePrefixResult></GetErrorMessagePrefixResponse></soap:Body></soap:Envelope>

6 réponses

Avatar
Patrice
> La requête du PC vers le serveur est envoyée une première fois et reçoit
une erreur 401. Le PC envoie à nouveau la requête, en ajoutant une ligne
«Authorization: Negotiate» suivie d'une longue chaîne hexa, et là il
reçoit la réponse.



Salut,

C'est normal (voir par exemple tout simplement le journal IIS). Le client ne
peut pas savoir à priori si une authentification sera nécessaire, donc il
envoie une première requête et le serveur indiquera en réponse (si c'est
bien le cas) qu'il faut une authentification. Le détail doit être expliqué
dans une RFC sur le sujet...

--
Patrice
Avatar
Gilbert Tordeur
Bonjour Patrice et merci pour la réponse.

Puisque le programmeur sait qu'il doit utiliser l'authentification intégrée
de Windows, comment peut-il renseigner le programme pour éviter un premier
appel inutile ? Je suis perdu depuis une heure dans ServicePointManager sans
même savoir si c'est une bonne piste !

Gilbert
Avatar
Patrice
> Puisque le programmeur sait qu'il doit utiliser l'authentification
intégrée
de Windows, comment peut-il renseigner le programme pour éviter un premier
appel inutile ? Je suis perdu depuis une heure dans ServicePointManager
sans même savoir si c'est une bonne piste !



A priori cela ne doit pas être possible . Le mot de passe n'est pas transmis
et le principe est donc de mémoire d'ECHANGER des informations entre le
client et le serveur pour que le client puisse prouver sa connaissance du
mot de passe sans transmettre le mot de passe lui-même. Je dirais donc que
ce n'est pas possible de part la conception même de l'authentification
intégrée...

Il est même possible que cela soit le cas pour les autres méthodes
d'authentification même si aucun échange n'est requis (l'idée étant que
c'est sur le serveur que la configuration est définie donc c'est à lui de
dire au client quelles sont les méthodes d'authentification qu'il accepte si
nécessaire). Cela serait intéressant de creuser plus en détail mais je pense
pour l'instant que c'est tout à fait normal. Je te dis si j'ai eu le temps
de trouver une explication complète sur le sujet...

--
Patrice
Avatar
Patrice
"Patrice" <http://scribe-fr.blogspot.com/&gt; a écrit dans le message de
news:

Cela serait intéressant de creuser plus en détail mais je pense pour
l'instant que c'est tout à fait normal. Je te dis si j'ai eu le temps de
trouver une explication complète sur le sujet...




Essaie peut-être :
http://msdn.microsoft.com/fr-fr/library/system.net.webrequest.preauthenticate.aspx

dont le fonctionnement est expliqué ici (en anglais) :
http://www.eggheadcafe.com/articles/20051104.asp

Mais :
- il semble que cela ne marche que pour l'authentification "basic"
- la première requête même en mode basic utilise le principe que tu as vu
(envoie d'une requête anonyme, réponse 401 du serveur, envoie du mot de
passe).

Je ne connais pas le détail de l'authentification intégrée mais le mot de
passe n'est pas transmis dans ce cas. Le principe est que le serveur
transmet une valeur qui permet de faire un calcul sur le mot de passe, puis
le résultat est envoyé vers le serveur, le serveur fait le même calcul et si
le résultat concorde c'est que le client connaissait bien le mot de passe.
Si cette valeur change à chaque fois par sécurité, alors il est possible que
le "preauthenticate" ne soit pas possible le client devant toujours faire un
nouveau calcul à partir d'une nouvelle valeur pour prouver à chaque nouvelle
requête qu'il connait bien le mot de passe (pour éviter l'exploitation d'une
requête antérieure par un pirate).

Ma conclusion serait le vieil adage : "if this is not broken don't fix it".
Si cela marche, que cela fonctionne avec un vitesse qui semble normale et
que le seul "problème" est la présence de ces requêtes 401 dans le journal,
je pense que tu peux les ignorer...

--
Patrice
Avatar
Gilbert Tordeur
Patrice,

Merci pour toutes ces précisions.

Ça m'interpellait de voir un aller-retour systématique pour rien, mais si
c'est voulu par Microsoft, il n'y a rien à faire, et je passe à autre chose.

Bonne journée,
Gilbert
Avatar
Gilbert Tordeur
Patrice,

Je crois avoir trouvé comment empêcher le premier coup pour rien :

MonService.PreAuthenticate = True

Par ailleurs, si tu avais le temps de regarder le message que j'ai laissé à
l'instant sur
microsoft.public.dotnet.languages.vb ... Merci d'avance.

Gilbert