c# - example - vb net httpwebrequest post data




HttpWebRequest ne transmet pas les informations d'identification (3)

Essayez de définir request.PreAuthenticate à true.

J'essaie d'utiliser HTTPWebRequest pour accéder à un service REST et j'ai des problèmes pour transmettre les informations d'identification, voir le code ci-dessous. J'ai lu que NetworkCredential ne prend pas en charge le protocole SSL et que je frappe un site HTTPS. Est-ce que quelqu'un connaît une classe similaire à NetworkCredential qui prend en charge SSL?

Uri requestUri = null;
Uri.TryCreate("https://mywebserver/webpage", UriKind.Absolute, out requestUri);
HttpWebRequest request = (HttpWebRequest)HttpWebRequest.Create(requestUri);
NetworkCredential nc = new NetworkCredential("user", "password");
request.Credentials = nc;
request.Method = WebRequestMethods.Http.Get;
HttpWebResponse response = (HttpWebResponse)request.GetResponse();

Quel type de mécanisme d'authentification protège le service Web? Les informations d'identification définies sur HttpWebRequest ne seront transmises que via l'en-tête d' Authorization HTTP via Basic , Digest ou NTLM . Ainsi, si votre service Web est protégé par WS-Security , les éléments NetworkCredentials ne seront probablement pas transmis au schéma d'authentification, car WS-Security ne fonctionne pas au niveau HTTP.

Ce que vous devez faire est de créer un proxy client de service Web pour le service Web via l'outil de ligne de commande wsdl.exe ou quelque chose de similaire. Cela vous donnera accès à des schémas d'authentification compatibles Web Service.

Mise à jour après les commentaires:

Il semble que HttpWebRequest doit recevoir le challenge WWW-Authenticate avec un 401 Unauthorized avant de pouvoir s'authentifier correctement via SSL. Je suppose qu'il existe deux chemins de code distincts dans HttpWebRequests gérer le trafic HTTP normal et le trafic HTTPS chiffré. Quoi qu'il en soit, ce que vous devriez essayer, c'est:

  1. Exécutez un HttpWebRequest non authentifié sur https://.../ URI.
  2. Recevoir la réponse 401 Unauthorized .
  3. Exécutez la même demande, maintenant avec les deux Credentials définies (ne savez pas si PreAuthenticate doit être true ou false ; testez les deux).
  4. Vous devriez maintenant obtenir 200 OK ou ce que votre service Web répond avec.

Une autre option consiste à créer vous-même l'en-tête d' Authorization sur la demande initiale:

string credentials = String.Format("{0}:{1}", username, password);
byte[] bytes = Encoding.ASCII.GetBytes(credentials);
string base64 = Convert.ToBase64String(bytes);
string authorization = String.Concat("Basic ", base64);
request.Headers.Add("Authorization", authorization);

Voir si elle apparaît lorsque vous utilisez la méthode ancienne:

string credentials = Convert.ToBase64String(ASCIIEncoding.ASCII.GetBytes("user"+ ":" + "password"));
request.Headers.Add("Authorization", "Basic " + credentials);




httpwebrequest