System.Net.WebClient
对象远程导航到ASP.NET应用程序中的Intranet网页。在我的开发服务器上,我能够无错误地点击页面。在我们的UAT服务器上,请求失败并出现401 Unauthorized
错误。两台服务器都是使用IIS8的Windows Server 2012。
编辑:(为了简单起见,我打算将其删除,但我认为这是相关的。这个ASP.NET网站包含在SharePoint 2013中。此应用程序吐出一个DLL,与SharePoint的ASP.NET页面结合使用。两个服务器都具有为SharePoint站点指定的相同身份验证:
所以实际上,唯一需要完成的身份验证是对SharePoint站点本身的身份验证。)
经过几个小时的测试后,我决定查看IIS事务日志,试图弄清楚发生了什么。我发现无论我传递给WebClient
对象的凭据是什么,它们都不会被IIS传递给我的UAT服务器上的请求,但它们位于我的开发服务器上(请参阅下面的IIS事务日志)< /强>
两个站点都应该被配置为彼此的精确复制品,我已经将两个服务器之间的网站的IIS设置与我的能力进行了比较,我似乎无法弄清楚它们之间的区别。
以下是正在开展工作的函数中的一些代码:
Private Sub CreateTiffFile()
Try
'Create NetworkCredentials object and set properties
Dim creds As New NetworkCredential
creds.UserName = "userid"
creds.Domain = "domain"
creds.Password = "password"
'Create WebClient object, set creds
Dim wc As New System.Net.WebClient()
wc.Credentials = creds
'Set the URL to navigate to based on the current URL and RequestID
_URL = Utility.CurrentURL & "PrintPreview.aspx?RequestId=" & _CurrentRequestID
'Read the page
Dim webReader As New System.IO.StreamReader(wc.OpenRead(_URL))
'Do other stuff here
'Do other stuff here
'etc.
Catch ex As Exception
Utility.ErrorHandler(ex, _CurrentRequestID)
End Try
End Sub
开发IIS事务日志(凭据正确传递):
2014-05-05 14:59:38 10.###.###.### GET /mysite/PrintPreview.aspx RequestId=9849&HideControls=1 80 - 10.###.###.### - - 401 0 0 1481
2014-05-05 14:59:38 10.###.###.### GET /mysite/PrintPreview.aspx RequestId=9849&HideControls=1 80 - 10.###.###.### - - 401 1 2148074254 0
2014-05-05 14:59:58 10.###.###.### GET /mysite/PrintPreview.aspx RequestId=9849&HideControls=1 80 0#.w|domain\userid 10.###.###.### - - 200 0 0 19468
在最后一行,您会注意到凭据已通过,并返回200 OK
。
UAT IIS事务日志(未传递凭据):
2014-05-05 15:16:16 10.###.###.## GET /mysite/PrintPreview.aspx RequestId=9851&HideControls=1 80 - 10.###.###.## - - 401 0 0 15
2014-05-05 15:16:16 10.###.###.## GET /mysite/PrintPreview.aspx RequestId=9851&HideControls=1 80 - 10.###.###.## - - 401 1 2148074254 15
2014-05-05 15:16:16 10.###.###.## GET /mysite/PrintPreview.aspx RequestId=9851&HideControls=1 80 - 10.###.###.## - - 401 1 2148074252 0
在最后一行,您会注意到最终交易返回401.1 Unauthorized
错误
(如果您现在还没有猜到,我基本上是将页面读取到流中,稍后我会使用数据将其写入本地共享中的html文件。)
到目前为止,这个过程一直运作良好。当我们将应用程序移动到新服务器时出现问题。
我花了好几天时间研究这个并没有找到原因。重要的是要注意我是一名开发人员,虽然我对在IIS中设置网站有相当多的了解,但我不是服务器管理员,我认为我已经达到了我的能力极限。
我应该如何进一步解决这个问题?任何见解/想法都会有所帮助。如果您有任何疑问,请随时提出,我会尽力回答。
答案 0 :(得分:2)
经过大量挖掘,我检查了服务器上的事件查看器,并在服务器事件查看器中找到了相应的警告:
程序w3wp.exe(已分配进程ID 7328)无法使用目标名称HTTP / codeuat.cmapps.stele.net在本地进行身份验证。使用的目标名称无效。目标名称应引用其中一个本地计算机名称,例如DNS主机名。尝试使用其他目标名称。
在对这个错误进行研究后,我发现很多人遇到了同样的问题。这导致我进入一个名为&#34; BackConnectionHostName&#34; ( HKEY_LOCAL_MACHINE \ SYSTEM \ CurrentControlSet \ Control \ Lsa \ MSV1_0 )的注册表项,它缺少主机名I尝试连接,因此身份验证失败。
将主机名添加到条目后,我能够正确传递身份验证并通过检查IIS日志来确认。
感谢大家的回复。
答案 1 :(得分:1)
您需要指定要使用的身份验证类型,如本回答https://stackoverflow.com/a/1680866/1425531
中所述至于猜测它为什么在一台服务器而不是另一台服务器上运行:第一台服务器是否只为该站点启用了基本身份验证,而另一台服务器上的站点是否具有Windows身份验证(ntlm)?