6 июня 2017 г.

Как отключить публикацию метаданных mex WCF сервисом.

Оглавление:

  1. WCF service. С чего начать. Основные моменты создание службы. 
  2. WCF. Callback через BasicHttpBinding без дуплексной связи.
  3. Realtime WCF Tracker вызовов клиентского приложения.
  4. Как отключить публикацию метаданных mex WCF сервисом. 

Публикация метаданных вашего сервиса может снизить безопасность системы. Ведь вы предоставляете возможность узнать всю необходимую для работы с ним информацию. При этом, отсутствие возможности получить информация никак не влияет на его работу. Поэтому хотелось бы рассказать как убрать публикацию метаданных сервиса, если не вы их включали. Для начала стоит знать, что метаданные могут быть доступны двумя способами:
  • Через HTTP-GET .
  • И через специально подготовленную Endpoint для MEX, используя IMetadataExchange.
На MSDN есть две статьи, описывающие наоборот, оба процесса настройки. Поэтому можно опираться и на них:

1. Проверяем файл конфигурации сервера.
1.1 Ищем HTTP-GET

Открываем файл конфигурации, в котором хранятся настройки для ваших сервисов. И ищем раздел  <serviceBehaviors

<system.serviceModel>
    <behaviors>
      <serviceBehaviors>
        <behavior name="SERVICEMETADATANAME">
          <serviceMetadata httpGetEnabled="true" httpsGetEnabled="true" />
        </behavior>
      </serviceBehaviors>
    </behaviors>
  </system.serviceModel>

Если таковой имеется, тогда ищем tag <behavior/>, у которого внутри есть <serviceMetadata />. Значения атрибутов http(s)GetEnabled="True" говорят о том, что все <services />, у которых задано <service behaviorConfiguration="SERVICEMETADATANAME"  />, будут публиковать свои метаданные. Поэтому для того, что бы отключить публикацию достаточно задать:<serviceMetadata httpGetEnabled="false" httpsGetEnabled="false" />
ВНИМАНИЕ! Если используется пустое значение name <behavior name="">, это говорит о том, что данное поведение будет применено ко ВСЕМ Endpoint вне зависимости от того, где происходит инициализация ServiceHost. Ещё одно замечание, Endpoint не может работать одновременно в режиме httpEnabled="false" и httpsEnabled="true" поэтому надо менять оба параметра.
 Запускаем Web сервер. Если при обращении к сервисам получаете сообщение
"Metadata publishing for this service is currently disabled", значит все сделано правильно.

1.2 Ищем настроенную на публикацию Endpoint в файле конфига.

При публикации сервиса может быть использована специальная MEX (Metadata EXchange) Endpoint. Она использует  универсальный контракт обмена метаданными через контракт:

[ServiceContract]
interface IMetadataExchange
{
    [OperationContract)]
    Message Get(Message request)
}

Его описание IMetadataExchange Interface на сайте msdn. К счастью его реализовывать не надо. А для того, что бы этот способ публикации заработал, в файле конфигурации должна присутствовать Endpoint с контрактом в виде IMetadataExchange. Пример:
<endpoint address="mex"
                  binding="mexHttpBinding"
                  contract="IMetadataExchange" />

Тут следует обратить внимание на значение атрибута контракта, оно должно быть contract="IMetadataExchange" а для отключение комментируем <endpoint />.

2. Ищем и выключаем в коде.

Выключение из кода, сводятся к поиску настроек, задаваемых в файле конфигурации.
  • Для пункта 1.1 стоит искать в коде ServiceMetadataBehavior и у него задавать значение:
    HttpGetEnabled = false;
  • Для пункта 1.2 необходимо найти, где в ServiceHost добавляется MetadataExchangeBindings.CreateMexTcpBinding() через метод serviceHost.AddServiceEndpoint().  И убрать добавление этой Endpoint.

    ВНИМАНИЕ!
    CreateMexTcpBinding() создает TCP привязку. Поэтому стоит искать текст по сигнатуре MetadataExchangeBindings.

Комментариев нет:

Отправить комментарий