System.Net.WebClient不适用于Windows身份验证

Pet*_*orf 12 iis ntlm webclient

我试图在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);
Run Code Online (Sandbox Code Playgroud)

我得到一个'远程服务器返回错误:(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
Run Code Online (Sandbox Code Playgroud)

我使用Process Monitor和Fiddler进行调查但无济于事.

为什么这适用于第三方浏览器,但不适用于IE或System.Net.WebClient?

Goy*_*uix 19

我见过类似的问题,只有在按机器名或localhost访问主机时,Integrated/NTLM安全性才有效.事实上,它是Windows中一个[不良]文档功能,旨在防止"反射攻击".

基本上,您需要在尝试访问服务器的计算机上创建一个注册表项,并将您尝试访问的域列入白名单.每个主机名/ FQDN都需要在它自己的行上 - 没有通配符,名称必须完全匹配.来自KB文章:

  • 单击"开始",单击"运行",键入regedit,然后单击"确定".
  • 在注册表编辑器中,找到并单击以下注册表项: HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Lsa\MSV1_0
  • 右键单击" MSV1_0",指向"新建",然后单击"多字符串值".
  • 键入BackConnectionHostNames,然后按ENTER键.
  • 右键单击" BackConnectionHostNames",然后单击"修改".
  • 在"数值数据"框中,键入本地计算机上站点的主机名或主机名,然后单击"确定".
  • 退出注册表编辑器,然后重新启动计算机.

http://support.microsoft.com/kb/956158/en-us

  • +10如果我可以投票10次,我会.结束了我3天的头部刮擦和谷歌搜索. (3认同)