Передача NetworkCredential в HttpWebRequest на С# со страницы ASP.Net

Я пытаюсь использовать HTTPWebRequest для доступа к веб-службе, и у меня возникают проблемы с передачей учетных данных, см. код ниже. Я вижу объект учетных данных, nc, который создается в отладчике, а также в назначении request.Credentials, но когда я дохожу до последней строки кода, он выдает сообщение об ошибке неавторизованного доступа. У меня были люди с нашего сервера, которые смотрели запрос на сервере, и никаких учетных данных не передавалось. Я делаю что-то не так с объектом Credentials или есть что-то, что мне нужно сделать, чего я здесь не делаю?

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

person Russ Clark    schedule 05.11.2009    source источник
comment
Вы использовали Fiddler, чтобы увидеть, что вы передаете? Мне не нравится полагаться на людей с серверами для оценки таких вещей :)   -  person JustLoren    schedule 05.11.2009
comment
JustLoren - я не знал о Fiddler, пока вы не опубликовали этот комментарий, я скачал его, и на вкладке «Аутентификация» написано, что отсутствует заголовок прокси-авторизации. Нет заголовка авторизации, поэтому я все еще думаю, что с моим кодом что-то не так.   -  person Russ Clark    schedule 06.11.2009
comment
Есть ли причина, по которой вы не создаете прокси-класс для вызова внутренней веб-службы?   -  person Ta01    schedule 10.11.2009
comment
Да, служба, которую я вызываю, является службой REST, поэтому файла wsdl нет.   -  person Russ Clark    schedule 10.11.2009


Ответы (3)


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. Работает как шарм.

person Rob Collins    schedule 04.06.2011
comment
Отлично, этот сработал, принятый ответ у меня не сработал. - person Justin Clarke; 12.03.2014

Поддержка Microsoft Premier, наконец, помогла мне решить эту проблему, используя класс CredentialCache для добавления учетных данных и «базовой» авторизации:

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

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

HttpWebRequest request = (HttpWebRequest)HttpWebRequest.Create(requestUri);
person Russ Clark    schedule 07.12.2009
comment
без использования ss l пароль будет передан в открытом виде? - person Royi Namir; 20.11.2012

Мне помогло (для моно Unity3d, а не ASP.Net):

request.PreAuthenticate = true;

Не нужно вручную задавать заголовок авторизации или использовать CredentialCache.

person Vladimir Pankov    schedule 15.08.2019