使用Visual Studios 2010在.NET 4.0中进行ONVIF身份验证

use*_*419 11 .net c# authentication ws-security onvif

我的任务是尝试与建筑物中的ONVIF摄像机建立通信,最终升级公司的domotic解决方案,以自动识别ONVIF摄像机,并能够设置它们并使用它们的服务.

我已经能够以这种方式收集一些基本信息,如模型,MAC地址和固件版本:

    EndpointAddress endPointAddress = new EndpointAddress("<mycameraurl:<mycameraport>/onvif/device_service");
    CustomBinding bind = new CustomBinding("DeviceBinding");
    DeviceClient temp = new DeviceClient(bind, endPointAddress);
    String[] arrayString = new String[4];
    String res = temp.GetDeviceInformation(out arrayString[0], out arrayString[1], out arrayString[2], out  arrayString[3]);
    MessageBox.Show("Model " + arrayString[0] + ", FirmwareVersion " + arrayString[1] + ", SerialNumber " + arrayString[2] + ", HardwareId " + arrayString[3]);
Run Code Online (Sandbox Code Playgroud)

我在app.config文件中有customBinding的xml规范:

  <customBinding>
    <binding name="DeviceBinding">
      <textMessageEncoding maxReadPoolSize="64" maxWritePoolSize="16"
          messageVersion="Soap12" writeEncoding="utf-8">
        <readerQuotas maxDepth="32" maxStringContentLength="8192" maxArrayLength="16384"
            maxBytesPerRead="4096" maxNameTableCharCount="16384" />
      </textMessageEncoding>
      <httpTransport manualAddressing="false" maxBufferPoolSize="524288"
          maxReceivedMessageSize="65536" allowCookies="false" authenticationScheme="Anonymous"
          bypassProxyOnLocal="false" decompressionEnabled="true" hostNameComparisonMode="StrongWildcard"
          keepAliveEnabled="false" maxBufferSize="65536" proxyAuthenticationScheme="Anonymous"
          realm="" transferMode="Buffered" unsafeConnectionNtlmAuthentication="false"
          useDefaultWebProxy="true" />
    </binding>
  </customBinding>
Run Code Online (Sandbox Code Playgroud)

我的问题是,我不可能更深入地了解我可以问相机的问题.对于我尝试的任何内容,我得到"400 - 错误请求"错误,并且根据我读过的内容,因为我需要处理相机的身份验证.

问题在于,我发现的关于WS-Security(它似乎被ONVIF使用)的所有内容都非常非常混淆,并且有很多不同的解决方案,而且对我来说没什么用.例如,这篇文章听起来很简单,但我试图创建一个UserNameSecurityToken,我仍然得到400个错误的请求错误.因为我不知道是不是因为我写了我的令牌系统错误,如果是因为相机不支持我尝试做的事情.

我已经尝试过WSHttpBinding并将其置于用户名模式,但使用WSHttpBinding打破了我能够创建的基本信息发现(带有MustUnderstand错误)......

对我来说有什么指针?简单的WS-Security/.NET,C#/ ONVIF教程,一切都将被接受.

use*_*419 12

行:

EndpointAddress serviceAddress = new EndpointAddress("<mycameraurl:<mycameraport>/onvif/device_service");

HttpTransportBindingElement httpBinding = new HttpTransportBindingElement();

httpBinding.AuthenticationScheme = AuthenticationSchemes.Digest;

var messageElement = new TextMessageEncodingBindingElement();

messageElement.MessageVersion = MessageVersion.CreateVersion(EnvelopeVersion.Soap12, AddressingVersion.None);

CustomBinding bind = new CustomBinding(messageElement, httpBinding);

// Add our custom behavior - this require the Microsoft WSE 3.0 SDK

PasswordDigestBehavior behavior = new PasswordDigestBehavior(CameraASCIIStringLogin, CameraASCIIStringPassword);

DeviceClient client = new DeviceClient(bind, serviceAddress);

client.Endpoint.Behaviors.Add(behavior);

// We can now ask for information

client.GetSystemDateAndTime();

client.GetNetworkInterfaces();

client.GetScopes();

client.GetRelayOutputs();

client.GetWsdlUrl();
Run Code Online (Sandbox Code Playgroud)

问题是摄像机在提供超出最简单信息之前的任何信息之前需要进行身份验证,最棘手的部分是最终捕获一个有效的xml onvif消息,以便在我自己的软件中重新创建它.

  • 对于那些不熟悉PasswordDigestBehavior的人,请参阅此博客文章:http://blog.benpowell.co.uk/2010/11/supporting-ws-i-basic-profile-password.html (2认同)