代码之家  ›  专栏  ›  技术社区  ›  Peter Hahndorf

system.net.webclient不适用于Windows身份验证

  •  12
  • Peter Hahndorf  · 技术社区  · 16 年前

    我尝试在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
    

    我用过程监视器和小提琴手进行调查,但无济于事。

    为什么这对第三方浏览器有效,但对ie或system.net.webclient无效?

    4 回复  |  直到 14 年前
        1
  •  18
  •   Goyuix    15 年前

    我看到了一个类似的问题,即只有通过计算机名或localhost访问主机时,集成/ntlm安全性才起作用。实际上,它是Windows中一个[糟糕]的文档功能,旨在防止“反射攻击”。

    基本上,您需要在试图访问服务器的计算机上创建一个注册表项,并将要访问的域白名单。每个主机名/fqdn都必须在自己的行上-没有通配符,并且名称必须完全匹配。从知识库文章:

    • 单击开始,单击运行,键入regedit,然后单击确定。
    • 在注册表编辑器中,找到并单击以下注册表项: hkey_local_machine\system\currentcontrolset\control\lsa\msv1_0
    • 右击 MSV1Y0 ,指向“新建”,然后单击“多字符串值”。
    • 类型 后端连接主机名 ,然后按Enter。
    • 右击 后端连接主机名 ,然后单击“修改”。
    • 在“值数据”框中,键入本地计算机上站点的主机名或主机名,然后单击“确定”。
    • 退出注册表编辑器,然后重新启动计算机。

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

        2
  •  4
  •   JP Alioto    16 年前

    你试过了吗…

    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配置错误。尝试将上面的“协商”替换为“基本”,并检查网站的IIS配置。还有很多可能的原因 here .

        3
  •  1
  •   R Ubben    16 年前

    尝试进入IE的选项并将站点显式添加到Intranet区域。然后重新运行程序。您也不应该从管理员登录名运行该程序。这可能会触发 Enhanced Security Configuration for Internet Explorer .

    它可以解释为什么你可以使用火狐和Opera访问这个网站,但不能使用IE或WebClient。

        4
  •  0
  •   Ariel    16 年前

    在不了解您的IIS部署的情况下,假设您在IIS中设置了正确的上载授权规则(例如,在您尝试上载内容的正确目录上设置了正确的allow*acl等),我首先尝试将useDefaultCredentials设置为true,而不是显式设置凭据。(也许您认为您正在使用所设置的凭据访问服务器,但事实并非如此?如果这个方法可行的话,这是可能的。)

    这是一个非常常见的场景,因此我将重点讨论您尝试上载文件的目录的IIS授权规则,该目录上的实际ACL。例如,你的网站是否在模仿?如果是,那么您必须在该目录上有实际的ACL,否则无论运行的是哪个帐户应用程序池。