Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/274.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# .NET WebClient先发送请求而不进行身份验证_C#_.net_Security_Webclient_Digest Authentication - Fatal编程技术网

C# .NET WebClient先发送请求而不进行身份验证

C# .NET WebClient先发送请求而不进行身份验证,c#,.net,security,webclient,digest-authentication,C#,.net,Security,Webclient,Digest Authentication,我正在用Asp.net web api构建一个web服务,我必须从AXIS IP摄像头获取图像。但是,相机使用摘要身份验证。所以我的C#代码看起来像这样: WebClient webClient = new WebClient(); webClient.UseDefaultCredentials = true; webClient.Credentials = new NetworkCredential("***", "***

我正在用Asp.net web api构建一个web服务,我必须从AXIS IP摄像头获取图像。但是,相机使用摘要身份验证。所以我的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错误。之后,它发送一个具有摘要安全性的

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

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


是否有任何方法可以立即发送已签名的请求,或者这是如何工作的,因为我注意到摄像头在第一个请求中返回nonce?

您无法避免第一个匿名请求,因为WebClient必须根据收到的401响应确定使用了哪种身份验证方案,它可以是基本的,消化的,等等。。。 看

使用digest,您无论如何都无法避免2个请求,因为第一个401响应包含一个nonce(客户端身份验证请求所需的值),请参阅


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

您是否尝试过?是的,该链接类似,我认为您是在告诉它使用默认凭据,然后设置显式凭据,先尝试将其设置为false,然后查看它是否有效,在这两个建议之后。如果您从非web应用程序(例如控制台应用程序定位)运行相同的代码,这是否有效?我的建议是,由于web应用程序在IIS下运行,所以它可能具有用户默认凭据以外的其他凭据。首先,它在不进行身份验证的情况下发送请求,然后使用。我用浏览器尝试了这个,只是转到这个URL。之后,它向我显示了登录窗口,我已经输入了它们,我得到了我的图像。当我调试时,我看到了与我的应用程序相同的结果。首先是401响应的请求,然后在我登录正确的请求之后。因为第一个响应包含一些安全信息,比如nonce和realm,所以它应该是这样工作的。有什么书可以让我更深入地了解这个安全协议吗?这很有帮助。实际上,由于basic auth WebClient不会在第一次请求时发送凭据,因此它会在发送凭据之前等待401。因此,如果您的服务器不兼容(例如,返回407,而不是像某些mailgun API那样返回401),它将永远不会发送凭据。喝倒采解决此问题的方法是按照您的建议手动设置授权标头-谢谢!