2009-11-05 1 views
7

Я пытаюсь использовать HTTPWebRequest для доступа к веб-службе, и у меня возникают проблемы с передачей учетных данных, см. Код ниже. Я вижу объект учетных данных, nc, который создается в отладчике, а также в задании request.Credentials, но когда я добираюсь до последней строки кода, он вызывает ошибку с недопустимым сообщением об ошибке. У меня были пользователи нашего сервера, которые смотрят запрос на сервере, и никаких учетных данных не передается. Я делаю что-то не так с объектом Credentials, или есть что-то, что мне нужно сделать, что я здесь не делаю?Передача NetworkCredential для HttpWebRequest в C# из ASP.Net Страница

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

Вы используете Fiddler, чтобы сами убедиться, что имеете в виду? Мне не нравится полагаться на серверных людей, чтобы оценивать такие вещи :) – JustLoren

+0

JustLoren - Я не знал о Fiddler, пока вы не разместили этот комментарий, я его загрузил, и на вкладке Auth в нем указано «Нет заголовка прокси-авторизации». Нет заголовка авторизации, поэтому я все еще думаю, что с моим кодом что-то не так. –

+0

Есть ли причина, по которой вы не создаете прокси-класс для вызова внутреннего веб-сервиса? – kd7

ответ

1

Premier Support Microsoft наконец-то помог мне решить эту проблему с помощью класса CredentialCache, чтобы добавить учетные данные и «Basic» разрешение:

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

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

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

не использует ss l, будет ли пароль передан в ясном тексте? –

12

В NetworkCredentials либо крайне не интуитивным, или слоеное , или оба. Независимо от того, вы можете решить эту проблему, минуя NetworkCredentials вообще и использовать этот метод (который я нашел, любезно mark.michaelis.net)

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

Так что вы делаете вручную создать заголовок для вашего HttpWebRequest и вставляя содержимое, как оно появляется в заголовке Basic Authentication. Работает как шарм.

+1

Отлично, этот работал, принятый ответ не сработал для меня. –