我正在尝试从名为SV-REQ的服务器上的ASP.Net页面上针对另一个名为SV-RES的IIS7服务器发出HttpWebRequest。当我在SV-RES上将IIS设置为使用Digest,Basic或Negotiate并对凭据缓存对象进行更改以使用适当的方法时,代码执行得很好,并且我从SV-RES获得有效的响应,确认用户凭据是正确的。但是,当我将IIS设置为在SV-RES上使用“ Windows身份验证”时,在凭据缓存对象中使用NTLM时,我会返回401错误。

我真的很茫然,如果有人知道如何进行这项工作,我将不胜感激。

注意:执行此代码的服务器正在通过HTTP的匿名身份验证下运行。如下面的代码所示,收到请求的服务器是HTTPS上的NTLM(如前所述)。

这是正在执行的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也是为ASP.Net 2.0配置的IIS7

远程服务器返回错误:(401)未经授权。
说明:执行当前Web请求期间发生未处理的异常。请查看堆栈跟踪,以获取有关错误及其在代码中起源的更多信息。

异常详细信息:System.Net.WebException:远程服务器返回错误:(401)未经授权。

源错误:


第31行:credCache.Add(mUri,“ NTLM”,新的NetworkCredential(muser,mpass,mdomain))
第32行:mreq.Credentials = credCache
第33行:Dim mres As HttpWebResponse = mreq.GetResponse
第34行:Dim sr作为StreamReader = New StreamReader(mres.GetResponseStream())
第35行:txtResult.Text = sr.ReadToEnd()



源文件:C:\ inetpub \ httproot \ contentscan.aspx.vb行:33

堆栈跟踪:


[WebException:远程服务器返回错误:(401)未经授权。]
   System.Net.HttpWebRequest.GetResponse()+1126
   C:\ inetpub \ httproot \ contentscan.aspx.vb中的contentscan.Page_Load(Object sender,EventArgs e):33
   System.Web.UI.Control.OnLoad(EventArgs e)+132
   System.Web.UI.Control.LoadRecursive()+66
   System.Web.UI.Page.ProcessRequestMain(布尔includeStagesBeforeAsyncPoint,布尔includeStagesAfterAsyncPoint)+2428

最佳答案

经过大量调查后,我在这里发现了问题。看起来它与某个安全更新相关,该更新并未真正被经常谈论,因此我在自己的网站上写了一篇有关此更新的文章:http://www.tinyint.com/index.php/2009/08/24/401-error-on-httpwebrequest-with-ntlm-authentication/

但是,它的不足之处是security update修补了SMB中的一个漏洞,其中一部分涉及在进行身份验证请求时对主机名进行环回检查。如果启用此环回检查,则必须在注册表中输入主机名才能进行正确的身份验证。

关于asp.net - 使用NTLM的HTTPS上的HttpWebRequest无法正常工作,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/1267830/

10-16 10:19