2009-11-05 4 views
7

J'essaie d'utiliser HTTPWebRequest pour accéder à un service Web et j'ai des problèmes pour transmettre des informations d'identification, voir le code ci-dessous. Je peux voir l'objet d'identifiants, nc, étant construit dans le débogueur, et aussi dans l'assignation à request.Credentials, mais quand j'arrive à la dernière ligne de code, il affiche un message d'erreur non autorisé. J'ai demandé à nos serveurs de regarder la requête sur le serveur et aucune information d'identification n'est transmise. Est-ce que je fais quelque chose de mal avec l'objet Credentials, ou y a-t-il quelque chose que je dois faire que je ne fais pas ici?Passage de NetworkCredential à HttpWebRequest en C# depuis ASP.Net Page

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

Avez-vous utilisé Fiddler pour voir par vous-même ce que vous passez? Je n'aime pas compter sur les gens du serveur pour évaluer les choses comme ça :) – JustLoren

+0

JustLoren - Je ne connaissais pas Fiddler jusqu'à ce que vous ayez posté ce commentaire, je l'ai téléchargé et sous l'onglet Auth, il est indiqué que No Proxy-Authorization Header est présent. Aucun en-tête d'autorisation n'est présent, donc je continue de penser qu'il y a un problème avec mon code. –

+0

Y a-t-il une raison pour laquelle vous ne générez pas de classe proxy pour appeler un service Web interne? – kd7

Répondre

1

Microsoft Premier Support finalement m'a aidé à résoudre ce problème en utilisant la classe CredentialCache pour ajouter les informations d'identification et l'autorisation « de base »:

NetworkCredential nc = 
    new NetworkCredential(GetSetting("username"), GetSetting("password")); 
CredentialCache cache = new CredentialCache(); 

cache.Add(requestUri, "Basic", nc); 

HttpWebRequest request = (HttpWebRequest)HttpWebRequest.Create(requestUri); 
+0

n'utilisant pas ss l, le mot de passe sera-t-il transféré en texte clair? –

12

Les NetworkCredentials sont soit extrêmement non-intuitive, ou squameuse , ou les deux. Peu importe, vous pouvez résoudre le problème en contournant NetworkCredentials tout à fait et utiliser cette méthode (que j'ai trouvé, avec la permission de mark.michaelis.net)

/* http://mark.michaelis.net/Blog/CallingWebServicesUsingBasicAuthentication.aspx */ 
byte[] credentialBuffer = new UTF8Encoding().GetBytes(username + ":" +password); 
req.Headers["Authorization"] ="Basic " + Convert.ToBase64String(credentialBuffer); 

Alors ce que vous faites est de créer manuellement un en-tête de votre HttpWebRequest et insertion du contenu tel qu'il apparaîtrait dans un en-tête Basic Authentication. Fonctionne comme un charme.

+1

Excellent, celui-ci a fonctionné, la réponse acceptée n'a pas fonctionné pour moi. –

Questions connexes