2009-11-09 6 views
31

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

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(); 

Répondre

20

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; 
+0

Cela a fonctionné pour moi, merci. –

3

Essayez le réglage request.PreAuthenticate à true.

+1

Selon [this] (http://weblog.west-wind.com/posts/2010/Feb/18/NET-WebRequestPreAuthenticate-not-quite-what-it-sounds-like) cela ne fonctionnera pas. Encore besoin de travail – chaZm

25

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 HTTP Authorization via Basic, Digest ou NTLM. Ainsi, si votre service Web est protégé avec WS-Security, le NetworkCredentials ne sera 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 Web Service pour le service Web via l'outil de ligne de commande wsdl.exe ou similaire. Cela vous donnera accès à des schémas d'authentification sensibles au service Web.

Mise à jour après les commentaires:

Il semble que HttpWebRequest doit recevoir le défi WWW-Authenticate avec un 401 Unauthorized avant de pouvoir authentifier correctement via SSL. Je suppose qu'il existe deux chemins de code distincts dans HttpWebRequests qui traitent le trafic HTTP normal et le trafic HTTPS crypté. Quoi qu'il en soit, ce que vous devriez essayer, est la suivante:

  1. exécuter un HttpWebRequest non authentifié à l'URI https://.../.
  2. Recevez la réponse 401 Unauthorized.
  3. Exécuter la même demande, maintenant avec les deux Credentials ensemble (pas sûr si PreAuthenticate devrait être true ou false; tester les deux).
  4. Vous devriez maintenant obtenir 200 OK ou quel que soit votre service Web.

Une autre option est de construire l'en-tête Authorization vous-même 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); 
+0

Désolé, je n'ai pas réalisé jusqu'à présent que c'est un service REST que j'appelle, donc il y a maintenant le fichier wsdl. En outre, je suis capable de parcourir le code dans le débogueur, et je peux le voir construire l'objet NetworkCredentials correctement, mais il ne semble pas être transmis avec le HttpWebRequest. Une dernière chose - je peux appeler le service REST en tapant le dans la barre d'adresse de mon navigateur, il doit donc utiliser mes informations d'identification de cette façon. –

+1

Vous n'avez pas écrit quel schéma d'authentification vous utilisez et où vous avez vos informations d'identification. De plus, s'il s'agit d'un service REST, il ne doit pas contenir de fichier WSDL. Un service Web avec un fichier WSDL est généralement un service Web SOAP qui est l'opposé direct d'un service Web REST. Etre capable d'accéder au Web Service avec un navigateur (sans entrer d'informations d'identification?) Semble être protégé par une authentification HTTP, peut-être NTLM. Est-ce vrai? –

+0

Aussi, quelle est la réponse que vous obtenez? Est-ce un «401 non autorisé», «403 Interdit» ou autre chose? –

48

Voir si elle 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); 
+0

cela a juste fonctionné pour moi. – ryancammer

+0

a juste travaillé pour moi aussi. – SouthShoreAK

+0

Résolu mon problème. Upvoted en raison de sa concision. – Skitterm

Questions connexes