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();
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;
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);
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:
HttpWebRequest
non authentifié vers le https://.../
URI.401 Unauthorized
réponse.Credentials
set (vous ne savez pas si PreAuthenticate
doit être true
ou false
; testez les deux).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);
Essayez de définir request.PreAuthenticate sur true.