12

我正在尝试在 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 开发机器上。

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

4

4 回答 4

21

我看到了一个类似的问题,集成/NTLM 安全性仅在您通过机器名称或本地主机访问主机时才起作用。事实上,它是 Windows 中一个 [糟糕的] 文档功能,旨在防止“反射攻击”。

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

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

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

于 2010-06-17T23:26:16.757 回答
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;

另外,据此可能是IIS配置错误。尝试将上面的“协商”替换为“基本”,并检查网站的 IIS 配置。这里还有很多可能的原因。

于 2009-06-23T01:14:32.470 回答
1

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

它可以解释为什么您可以使用 Firefox 和 Opera 访问该站点,但不能使用 IE 或 WebClient。

于 2009-06-23T02:04:38.983 回答
0

在不知道您的 IIS 部署的情况下,并假设您在 IIS 中设置了正确的上传授权规则(例如,您尝试将内容上传到的正确目录上的正确允许* ACL 等),我会尝试的第一件事是设置UseDefaultCredentials 为 true,而不是显式设置 Credential。(也许您认为您正在使用您设置的凭据访问服务器,但事实并非如此?如果这可行,那将是可能的。)

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

于 2009-06-23T01:23:26.930 回答