web-dev-qa-db-fra.com

HttpWebRequest ne transmet pas les informations d'identification

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 SSL et je visite un site HTTPS. Quelqu'un connaît-il 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();
32
Russ Clark

Si votre serveur utilise l'authentification NTLM, vous pouvez essayer ceci:

CredentialCache cc = new CredentialCache();
cc.Add(
    new Uri("https://mywebserver/webpage"), 
    "NTLM", 
    new NetworkCredential("user", "password"));
request.Credentials = cc;
21
Darin Dimitrov

Vérifiez si cela apparaît lorsque vous utilisez la méthode à l'ancienne:

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

Quel type de mécanisme d'authentification protège le service Web? Les informations d'identification définies sur HttpWebRequest seront uniquement transmises via l'en-tête Authorization de HTTP via Basic , Digest ou NTLM . Donc, si votre service Web est protégé par WS-Security, le NetworkCredentials ne sera probablement pas du tout 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 avec le service Web.

Mise à jour après les commentaires:

Il semble que HttpWebRequest ait besoin de recevoir le WWW-Authenticate défi avec un 401 Unauthorized avant de pouvoir s'authentifier correctement via SSL. Je suppose qu'il y a deux chemins de code distincts dans HttpWebRequests gérant 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é vers le https://.../ URI.
  2. Recevez le 401 Unauthorized réponse.
  3. Exécutez la même requête, maintenant avec les deux Credentials set (vous ne savez pas si PreAuthenticate doit être true ou false; testez les deux).
  4. Vous devriez maintenant obtenir 200 OK ou quoi que ce soit auquel votre service Web répond.

Une autre option consiste à créer vous-même l'en-tête Authorization à 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);
26
Asbjørn Ulsberg

Essayez de définir request.PreAuthenticate sur true.

3
David