我正在尝试在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)未经授权',实际上是401.2
客户端和IIS都在同一台Windows Server 2003 Dev计算机上。
当我尝试在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进行调查但无济于事。
为什么这适用于第三方浏览器,但不适用于IE或System.Net.WebClient?
答案 0 :(得分:19)
我见过类似的问题,只有在按机器名或localhost访问主机时,Integrated / NTLM安全性才有效。事实上,它是Windows中一个[不良]文档功能,旨在防止“反射攻击”。
基本上,您需要在尝试访问服务器的计算机上创建一个注册表项,并将您尝试访问的域列入白名单。每个主机名/ FQDN都需要在它自己的行上 - 没有通配符,名称必须完全匹配。来自知识库文章:
答案 1 :(得分:4)
你试过......
new NetworkCredential( "peter", "password", "boxname" );
您也可以尝试......
var credCache = new CredentialCache();
credCache.Add( new Uri ("http://localhost/upload.aspx"),
"Negotiate",
new NetworkCredential("peter", "password", "boxname"));
wc.Credentials = credCache;
另外,根据this,可能是IIS配置错误。尝试将“Negotiate”替换为上面的“Basic”并检查网站的IIS配置。还有一堆可能的原因here。
答案 2 :(得分:1)
尝试进入IE的选项并明确将网站添加到Intranet区域。然后重新运行该程序。您也不应该从管理员登录中运行该程序。这可能会触发Enhanced Security Configuration for Internet Explorer。
它可以解释为什么你可以使用Firefox和Opera访问该网站,但不能使用IE或WebClient。
答案 3 :(得分:0)
在不知道您的IIS部署的情况下,并假设您在IIS中拥有正确的上传设置授权规则(例如,右侧允许* ACL,您尝试将内容上传到其他目录等),首先我会尝试是将UseDefaultCredentials设置为true而不是显式设置Credential。 (也许您认为您正在使用您正在设置的凭据访问服务器但情况并非如此?如果可行的话,这将是可能的。)
这是一种非常常见的情况,因此我将重点关注您尝试上传文件的目录的IIS授权规则,即该目录上的实际ACL。对于前者你的网站是否冒充?如果是,那么你必须在该目录上有实际的ACL,否则无论是什么帐户应用程序池都在运行。