2009-07-02 9 views
3

J'accède à un service Web REST à partir d'une application VB. Je crée un objet HttpWebResponse et j'appelle GetRequestStream dessus très bien, mais quand j'appelle GetResponse, j'obtiens une exception 401.Traitement de l'authentification avec HttpWebRequest (.NET)

Voici mon code (modifié pour l'affichage):

Dim webRequest = DirectCast(WebRequest.Create(endpoint), HttpWebRequest) 
webRequest.Method = "POST" 
webRequest.ContentLength = contentLength 
webRequest.ContentType = "application/x-www-form-urlencoded" 

request.Credentials = New NetworkCredential(Username, Password) 

' Works fine 
Using stream As Stream = webRequest.GetRequestStream() 
    stream.Write(data, 0, data.Length) 
End Using 

' Barfs 
Dim response As HttpWebResponse = DirectCast(webRequest.GetResponse(), HttpWebResponse) 

je reçois un 401 exception, dès que je l'appelle "webRequest.GetResponse()". Il y a un en-tête "WWW-Authenticate" dans la réponse, avec le domaine approprié. J'ai essayé de définir "webRequest.PreAuthenticate = True", ainsi que de définir manuellement l'en-tête avec "webRequest.Headers.Add (HttpRequestHeader.Authorization, _authheader)"

Je ne peux pas sembler surveiller ces demandes avec Fiddler/Wireshark etc. parce que c'est le trafic SSL, je suis sûr qu'il y a un moyen de le surveiller, je ne l'ai pas encore trouvé.

Merci à l'avance,

--Connor

Répondre

1

Merci à tous pour votre aide! Le problème était que j'étais redirigé! Je pense que tout ce que je dois faire est de changer l'en-tête de l'adresse pour refléter l'URL que je vais être redirigé à la fin d'un post.

3

Essayez d'ajouter d'ajouter manuellement l'en-tête AUTHORIATION, quelque chose comme ...

string autorization = userName + ":" + password; 
byte[] binaryAuthorization = System.Text.Encoding.UTF8.GetBytes(autorization); 
autorization = Convert.ToBase64String(binaryAuthorization); 
autorization = "Basic " + autorization; 
webRequest.Add("AUTHORIZATION", autorization); 

Cela a fonctionné pour moi le passé où la définition de la propriété Credentials a échoué.

+0

J'ai essayé ceci, mais cela n'a pas fonctionné pour moi. –

+0

Je ne peux pas croire que j'ai dû ajouter manuellement l'en-tête d'autorisation pour que ma requête Web fonctionne, mais cela a fonctionné quand 'request.Credentials = New NetworkCredential (nom d'utilisateur, mot de passe)' n'a pas fonctionné. Comme j'utilisais un HttpWebRequest, j'ai ajouté l'AUTORISATION en utilisant 'request.Headers.Add (" AUTORISATION ", autorisation);' – cwadding

0

Il est certainement possible que ce n'est pas votre problème, mais j'ai eu des problèmes d'authentification dans le passé qui ont été résolus par la mise

request.ProtocolVersion = HttpVersion.Version10 
Questions connexes