Аутентификация ONVIF в .NET 4.0 с Visual Studios 2010

Моя задача — попытаться установить связь с ONVIF-камерой в здании, чтобы, в конечном итоге, модернизировать домашнее решение компании для автоматического распознавания 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]);

У меня есть эта спецификация xml для customBinding в моем файле app.config:

  <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>

Моя проблема в том, что я не могу углубиться в то, что могу спросить у камеры. Я получаю ошибки «400 — Bad request» при любых попытках, и, судя по тому, что я прочитал, это связано с тем, что мне нужно выполнить аутентификацию для камеры.

Проблема в том, что все, что я нахожу о WS-Security (которое, кажется, используется ONVIF), очень, очень запутано, с множеством разных решений, и ничего действительно не работает для меня. Например, здесь это звучит очень просто, но я Я пытался создать UserNameSecurityToken, и я все еще получаю 400 ошибок неверного запроса. Поскольку я не знаю, то ли это из-за того, что я неправильно написал свою систему токенов, то ли из-за того, что камера не поддерживает то, что я пытаюсь сделать.

Я уже пробовал WSHttpBinding и помещал его в режим имени пользователя, но использование WSHttpBinding прерывает обнаружение основной информации, которое я смог создать (с ошибкой MustUnderstand)...

Любые указатели для меня? Простые руководства по WS-Security/.NET, C#/ONVIF, все будет принято.


person user704419    schedule 12.04.2011    source источник
comment
Это примечание... Тот факт, что вы, кажется, указываете, что вы новичок в С#, и вы смогли зайти так далеко, впечатляет.   -  person Security Hound    schedule 12.04.2011
comment
Что ж, я много лет занимался JAVA, и, в конце концов, это определенно проще, чем несколько лет назад, теперь вы обычно можете найти небольшие фрагменты кода в Интернете.   -  person user704419    schedule 13.04.2011


Ответы (1)


Хорошо:

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();

Проблема заключалась в том, что камера требовала аутентификации, прежде чем предоставлять какую-либо информацию, кроме самой простой, и самой сложной частью было, наконец, поймать работающее сообщение xml onvif, чтобы воссоздать его в моем собственном программном обеспечении.

person user704419    schedule 15.04.2011
comment
Для тех, кто не знаком с PasswordDigestBehavior, см. эту запись в блоге: blog.benpowell.co.uk/2010/11/ - person Jesse Chisholm; 16.08.2012