【发布时间】:2010-11-05 00:51:51
【问题描述】:
我正在尝试在 WinForms 应用程序中使用 System.Net.WebClient 将文件上传到具有 Windows 身份验证的 IIS6 服务器 它只是“身份验证”方法。
WebClient myWebClient = new WebClient();
myWebClient.Credentials = new System.Net.NetworkCredential(@"boxname\peter", "mypassword");
byte[] responseArray = myWebClient.UploadFile("http://localhost/upload.aspx", fileName);
我收到“远程服务器返回错误:(401) Unauthorized”,实际上是 401.2
客户端和 IIS 都在同一台 Windows Server 2003 开发机器上。
当我尝试在 Firefox 中打开该页面并输入与代码中相同的正确凭据时,该页面出现了。 但是在使用 IE8 时,我得到了同样的 401.2 错误。
试过 Chrome 和 Opera,它们都可以工作。
我在 IE Internet 选项中启用了“启用集成 Windows 身份验证”。
安全事件日志有一个失败审计:
Logon Failure:
Reason: An error occurred during logon
User Name: peter
Domain: boxname
Logon Type: 3
Logon Process: ÈùÄ
Authentication Package: NTLM
Workstation Name: boxname
Status code: 0xC000006D
Substatus code: 0x0
Caller User Name: -
Caller Domain: -
Caller Logon ID: -
Caller Process ID: -
Transited Services: -
Source Network Address: 127.0.0.1
Source Port: 1476
我使用 Process Monitor 和 Fiddler 进行调查,但无济于事。
为什么这适用于 3rd 方浏览器,但不适用于 IE 或 System.Net.WebClient?
【问题讨论】:
-
将 IIS 中的单一身份验证方法从集成 Windows 更改为 Basic 后,它可以工作,但这并不能解决我的问题,因为我无法在生产服务器上更改该设置。
-
我使用 IIS 的“身份验证和访问控制诊断工具”来监控进程,并将 Firefox 的日志与 IE 的日志进行了比较。在 NTLM 质询/响应失败之前,它看起来一切正常,但它也没有给我任何线索,为什么会这样。
-
我做了更多测试:上面描述的2003 Server实际上是Virtual PC中的VM,当在主机上使用IE时我可以进行身份验证,但不能在guest上使用IE。但是,当使用站点的 IP 地址而不是通过主机文件设置的主机名时,使用来宾的 IE 可以正常工作。这里有些东西坏了!我很高兴它不在生产服务器上。