32 votes

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

48voto

Ed Power Points 3179

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

26voto

asbjornu Points 5042

Ce type de mécanisme d'authentification est de protéger le service web? L'identification sur HttpWebRequest ne seront communiquées via HTTP est Authorization d'en-tête via Basic, Digest ou NTLM. Donc, si votre service web est protégé par WS-Security, l' NetworkCredentials ne sera probablement pas être répercuté sur le schéma d'authentification à tous, car WS-Security ne fonctionne pas au niveau HTTP.

Ce que vous devez faire est de créer un client de Service Web proxy du service web par le biais de l'outil de ligne de commande wsdl.exe ou quelque chose de similaire. Qui vous donnera accès au Service Web, conscient de schémas d'authentification.

Mise à jour après les commentaires:

Il semble que l' HttpWebRequest a besoin de recevoir l' WWW-Authenticate défi avec un 401 Unauthorized avant de pouvoir s'authentifier correctement sur SSL. Je pense qu'il y a deux chemins de code en HttpWebRequests de la manipulation régulière du trafic HTTP et HTTPS chiffré de la circulation. De toute façon, ce que vous devriez essayer, c'est:

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

Une autre option est de construire l' Authorization - tête 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);

21voto

Darin Dimitrov Points 528142

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;
 

3voto

David Points 20209

Essayez de définir request.PreAuthenticate sur true.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X