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

Le
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 widthP0 border=0
cellspacing><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80">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 ontent-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>
Vidéos High-Tech et Jeu Vidéo
Téléchargements
Vos réponses
Gagnez chaque mois un abonnement Premium avec GNT : Inscrivez-vous !
Trier par : date / pertinence
Patrice
Le #19927401
> 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
Gilbert Tordeur
Le #19927391
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
Patrice
Le #19928681
> 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
Patrice
Le #19928951
"Patrice" 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
Gilbert Tordeur
Le #19940681
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
Gilbert Tordeur
Le #20031801
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
Publicité
Poster une réponse
Anonyme