2009-11-05 9 views
7

Próbuję użyć HTTPWebRequest, aby uzyskać dostęp do usługi sieci Web, i mam problemy z przekazywaniem poświadczeń, zobacz poniższy kod. Widzę obiekt poświadczeń, nc, będący wbudowany w debugger, a także w przypisanie do request.Credentials, ale kiedy dojdę do ostatniej linii kodu, powoduje to błąd z nieautoryzowanym komunikatem o błędzie. Kazałem naszym użytkownikom serwera obserwować żądanie na serwerze i nie są przekazywane żadne poświadczenia. Czy robię coś nie tak z obiektem Credentials, czy jest coś, co muszę zrobić, czego nie robię tutaj?Przekazywanie NetworkCredential do HttpWebRequest w języku C# z ASP.Net Strona

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

Czy użyłeś Skrzypka, aby przekonać się, co przechodzisz? Nie lubię polegać na serwerach, żeby oceniać takie rzeczy :) – JustLoren

+0

JustLoren - Nie wiedziałem o skrzypce dopóki nie zamieściłem tego komentarza, pobrałem go i na karcie Auth mówi, że nie ma nagłówka Authorization-Authorization. Brak nagłówka autoryzacji, więc nadal myślę, że coś jest nie tak z moim kodem. –

+0

Czy istnieje powód, dla którego nie tworzysz klasy proxy, aby połączyć się z wewnętrzną usługą sieciową? – kd7

Odpowiedz

1

Microsoft Premier Support końcu pomógł mi rozwiązać ten problem za pomocą klasy CredentialCache dodać mandatów oraz „Basic” pozwolenia:

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

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

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

nie używając ss l, czy hasło zostanie przesłane czystym tekstem? –

12

W NetworkCredentials są albo bardzo nieintuicyjne lub łuszcząca , lub oba. Niezależnie od tego, można rozwiązać ten problem przez pominięciem NetworkCredentials całkowicie i używać tej metody (co znalazłem, dzięki uprzejmości mark.michaelis.net)

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

Więc co robisz jest ręcznie tworząc nagłówek swój HttpWebRequest i wstawianie zawartości takiej, jaka byłaby widoczna w nagłówku podstawowego uwierzytelniania. Działa jak marzenie.

+1

Dobrze, ten zadziałał, zaakceptowana odpowiedź nie zadziałała. –

Powiązane problemy