【问题标题】:.NET WebClient sends request without authentication first.NET WebClient 首先发送请求而无需身份验证
【发布时间】:2013-06-06 03:21:08
【问题描述】:

我正在使用 Asp.net Web api 构建 Web 服务,并且我必须从 AXIS IP 摄像机获取图像。但是,相机使用 Digest 身份验证。所以我的 C# 代码看起来像这样:

            WebClient webClient = new WebClient();
            webClient.UseDefaultCredentials = true;
            webClient.Credentials = new NetworkCredential("***", "***");
            byte[] imageStream = webClient.DownloadData("http://192.168.0.90/axis-cgi/jpg/image.cgi");

这一切都可以,但是在查看 Fiddler 时,我发现客户端发送一个请求没有经过身份验证,并返回 401 错误。之后,它会发送具有摘要安全性的邮件。

我在这里找到了手动凭据注入​​的解决方案:

http://kristofmattei.be/2013/02/20/webclient-not-sending-credentials-heres-why/

但这看起来不对。它使用基本身份验证,我真的不想要,而且看起来有点不专业。

有什么方法可以立即发送已签名的请求,还是因为我注意到相机在第一个请求中返回了随机数,所以这是这样工作的?

【问题讨论】:

  • 嗯,那个链接是相似的,我想你是在告诉它使用默认凭据,然后设置显式凭据,尝试先将其设置为 false,然后看看它是否有效
  • 在两个建议之后没有改变。
  • 如果您从非 Web 应用程序(例如控制台应用程序定位)运行相同的代码,这是否有效?我的建议是,由于 Web 应用程序在 IIS 下运行,它可能具有您用户的默认凭据以外的其他凭据。
  • 明确一点,这行得通。首先它发送没有身份验证的请求,然后发送。我用浏览器试过这个,只是去这个 URL。之后它向我显示了登录窗口,我输入了它们,然后我恢复了我的图像。当我调试它时,我看到的和我的应用程序一样。首先是 401 响应的请求,然后在我登录正确的请求之后。这真的看起来应该像那样工作,因为第一个响应带有一些安全信息、随机数和领域。有什么书可以让我阅读更多有关此安全协议的更多信息以更深入地了解吗?

标签: c# .net security webclient digest-authentication


【解决方案1】:

您无法避免第一个匿名请求,因为 WebClient 必须根据他收到的 401 响应来确定使用了哪种身份验证方案,它可能是基本的、摘要的等...... 见that question。

使用摘要,无论如何您都无法避免 2 个请求,因为第一个 401 响应包含一个随机数(客户端身份验证请求所需的值),请参阅Digest access authentication, Wikipedia。

如果是基本身份验证,您可以通过使用您的凭据手动设置所需的标头来避免第一个请求。

【讨论】:

  • 这很有帮助。实际上,对于基本身份验证,WebClient 不会在第一次请求时发送凭据,它会在发送之前等待 401。因此,如果您的服务器不兼容(例如,返回 407 而不是某些 mailgun API 的 401),它将永远不会发送凭据。嘘!解决此问题的方法是按照您的建议手动设置授权标头 - stackoverflow.com/a/9699211/118878 谢谢!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-03-29
  • 2016-03-22
  • 1970-01-01
相关资源
最近更新 更多