IIS未使用.NET WebClient对象传递凭据

时间:2014-05-05 18:25:17

标签: asp.net vb.net iis windows-authentication iis-8

好吧,伙计们,这个问题已经困扰了我好几天了。有许多类似问题的例子,但它们似乎都不适合我所拥有的问题。我正在尝试使用VB.NET System.Net.WebClient对象远程导航到ASP.NET应用程序中的Intranet网页。在我的开发服务器上,我能够无错误地点击页面。在我们的UAT服务器上,请求失败并出现401 Unauthorized错误。两台服务器都是使用IIS8的Windows Server 2012。

编辑:(为了简单起见,我打算将其删除,但我认为这是相关的。这个ASP.NET网站包含在SharePoint 2013中。此应用程序吐出一个DLL,与SharePoint的ASP.NET页面结合使用。两个服务器都具有为SharePoint站点指定的相同身份验证:

enter image description here

所以实际上,唯一需要完成的身份验证是对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中设置网站有相当多的了解,但我不是服务器管理员,我认为我已经达到了我的能力极限。

我应该如何进一步解决这个问题?任何见解/想法都会有所帮助。如果您有任何疑问,请随时提出,我会尽力回答。

2 个答案:

答案 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)?