Выполнение веб-запроса к веб-странице, требующей проверки подлинности Windows

Я пытаюсь сделать запрос на веб-страницу, используя класс WebRequest в .net. URL-адрес, который я пытаюсь прочитать, требует проверки подлинности Windows, из-за которой я получаю несанкционированное исключение. Как передать этому запросу учетные данные Windows, чтобы он мог пройти аутентификацию.

HttpWebRequest request = (HttpWebRequest)HttpWebRequest.Create( "http://myapp/home.aspx" );

request.Method = "GET";
request.UseDefaultCredentials = false;
request.PreAuthenticate = true;
request.Credentials = new NetworkCredential( "username", "password", "domain" );

HttpWebResponse response = (HttpWebResponse)request.GetResponse(); // Raises Unauthorized Exception

this.Response.Write( response.StatusCode );

Приведенный выше код возвращает следующую ошибку.

System.Net.WebException: The remote server returned an error: (401) Unauthorized.

При проверке деталей исключения я заметил одну вещь: URL-адрес, к которому я пытаюсь получить доступ, перенаправляет на другой URL-адрес, который предлагает мне предоставить данные для входа в NT. Я считаю, что учетные данные также должны быть перенаправлены на этот URL-адрес. Но, видимо, этого не происходит.


person Hemanshu Bhojak    schedule 25.08.2010    source источник
comment
Это может помочь: msdn.microsoft.com/en-us/library/ff647405. aspx   -  person NullUserException    schedule 25.08.2010
comment
Спасибо, установка PreAuthenticate на true помогла решить мою проблему.   -  person Michael    schedule 18.06.2012


Ответы (4)


Вы должны использовать свойство Credentials для передачи окон учетные данные для веб-службы.

Если вы хотите передать сервису учетные данные текущего пользователя Windows, тогда

request.Credentials = CredentialCache.DefaultCredentials;

должен сделать свое дело. В противном случае используйте NetworkCredential следующим образом:

request.Credentials = new NetworkCredential(user, pwd, domain);
person VinayC    schedule 25.08.2010
comment
Как вы можете видеть в опубликованном мною коде, я использую класс NetworkCredential, чтобы передать свой логин в Windows. Но даже это не работает. - person Hemanshu Bhojak; 25.08.2010
comment
Вы вставили код позже - не припомню, чтобы видел. Тем не менее, ошибка 401 означает, что учетные данные могут быть неправильными, или это также может означать, что учетные данные верны, но у этого пользователя нет доступа к этому URL-адресу. Я предлагаю вам проверить URL-адрес вашей службы в браузере. Если он работает оттуда, он должен работать и с WebRequest, а также. - person VinayC; 25.08.2010
comment
Я отредактировал пост и включил код. Кроме того, я могу получить доступ к URL-адресу в браузере с учетными данными, но не могу сделать то же самое с помощью WebRequest. - person Hemanshu Bhojak; 26.08.2010
comment
Попробуйте с помощью request.PreAuthenticate = false; Причина в том, что сервер выдает 401 в качестве ответа на запрос, и WebRequest не будет отвечать на запрос, если это свойство не имеет значения false. - person VinayC; 26.08.2010
comment
Вот незадача! И последнее предложение - используйте такой инструмент, как Fiddler (www.fiddler2.com), и сравните цепочку запросов-ответов от браузера (до службы) с той же цепочкой из WebRequest. Как вы сказали, служба работает из браузера, сравнивая запрос-ответ, вы должны понять, в чем проблема. - person VinayC; 27.08.2010
comment
Проверьте свои заголовки на exception.Response - у меня были проблемы с вмешательством моего прокси. - person Troy Parsons; 03.04.2012
comment
request.PreAuthenticate должно быть правдой. Если вы выполняете внутренний WebRequest вместо этого HttpWebRequest, вам также необходимо установить .Credentials для этого объекта. - person vapcguy; 21.04.2020

Для аутентификации в WebService используйте DefaultNetworkCredentials вместо DefaultCredentials:

request.Credentials = CredentialCache.DefaultNetworkCredentials;
person Vitaliy Ulantikov    schedule 24.10.2011
comment
Это устранило проблему, которую я пытался исправить в течение недели. Спасибо! - person empz; 11.01.2013
comment
Мне интересно, поможет ли это исправить мою текущую проблему: stackoverflow.com/questions/67335532/? Я читал противоречивые вещи относительно различий между ними. Я попробую как можно скорее. - person AFract; 15.05.2021

Я пытаюсь получить доступ к ссылке A, передающей учетные данные Windows. Затем ссылка A автоматически перенаправляет меня на ссылку B, но не передает предоставленные мной учетные данные Windows. Отсюда ошибка. Я сделал request.AutoRedirect = false и перебирал каждый раз, когда я получаю местоположение в заголовке, т.е. я делаю свои перенаправления вручную каждый раз, когда передаю учетные данные Windows.

Это сработало для меня :)

person Hemanshu Bhojak    schedule 31.08.2010

Используя VS2015, request.UseDefaultCredentials = true; у меня работает!

person Rob Bowman    schedule 15.03.2016