Вопрос

Я пытаюсь выполнить HttpWebRequest со страницы ASP.Net на сервере с именем SV-REQ на другом сервере IIS7 с именем SV-RES.Когда я настраиваю IIS в SV-RES на использование Digest, Basic или Negotiate и вношу изменения в объект кэша учетных данных для использования соответствующего метода, код выполняется нормально, и я получаю действительный ответ от SV-RES, подтверждающий правильность учетных данных пользователя.Однако, когда я настраиваю IIS на использование "Проверки подлинности Windows" в SV-RES, я возвращаю ошибку 401 при использовании NTLM в объекте кэша учетных данных.

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

Примечание:Сервер, на котором выполняется этот код, работает под анонимной аутентификацией по протоколу HTTP.Сервер, получающий запрос, является NTLM (как было указано ранее) по протоколу HTTPS, как можно видеть в приведенном ниже коде.

Это код в SV-REQ, который выполняется.SV-REQ является IIS7 и настроен для ASP.Net 2.0

Dim credCache As CredentialCache = New CredentialCache()
Dim mUri As Uri = New Uri("https://sv-res.my-domain-here.com/default.htm")
Dim mreq As HttpWebRequest = WebRequest.Create(mUri.ToString)
credCache.Add(mUri, "NTLM", New NetworkCredential(muser, mpass, mdomain))
mreq.Credentials = credCache
Dim mres As HttpWebResponse = mreq.GetResponse

Вот ошибка, которую я получаю от SV-RES из приведенного выше кода.SV-RES также настроен на IIS7 для ASP.Net 2.0

The remote server returned an error: (401) Unauthorized. 
Description: An unhandled exception occurred during the execution of the current web request. Please review the stack trace for more information about the error and where it originated in the code. 

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

Source Error: 


Line 31:         credCache.Add(mUri, "NTLM", New NetworkCredential(muser, mpass, mdomain))
Line 32:         mreq.Credentials = credCache
Line 33:         Dim mres As HttpWebResponse = mreq.GetResponse
Line 34:         Dim sr As StreamReader = New StreamReader(mres.GetResponseStream())
Line 35:         txtResult.Text = sr.ReadToEnd()



Source File: C:\inetpub\httproot\contentscan.aspx.vb    Line: 33 

Stack Trace: 


[WebException: The remote server returned an error: (401) Unauthorized.]
   System.Net.HttpWebRequest.GetResponse() +1126
   contentscan.Page_Load(Object sender, EventArgs e) in C:\inetpub\httproot\contentscan.aspx.vb:33
   System.Web.UI.Control.OnLoad(EventArgs e) +132
   System.Web.UI.Control.LoadRecursive() +66
   System.Web.UI.Page.ProcessRequestMain(Boolean includeStagesBeforeAsyncPoint, Boolean includeStagesAfterAsyncPoint) +2428
Это было полезно?

Решение

Что ж, после довольно продолжительного расследования я обнаружил проблему здесь.Похоже, это связано с обновлением для системы безопасности, о котором на самом деле не очень часто говорят, и поэтому я опубликовал сообщение об этом на своем сайте: http://www.tinyint.com/index.php/2009/08/24/401-error-on-httpwebrequest-with-ntlm-authentication/

Однако суть этого в том, что обновление для системы безопасности исправляет уязвимость в SMB, и часть этого включает в себя циклическую проверку имени хоста при выполнении запросов на аутентификацию.Если вы оставите эту циклическую проверку включенной, вам придется ввести свое имя хоста в реестре, чтобы иметь возможность правильно пройти аутентификацию.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top