Две конечные точки для одной и той же службы в WCF, одна не защищенная, другая - PullRequest
9 голосов
/ 17 ноября 2010

У меня есть служба .Net, работающая на IIS 6 и WCF, для которой я хочу создать две конечные точки. Один защищен HTTPS и базовой аутентификацией, к которой будет обращаться из нашей DMZ, и один конечный пункт без защиты, который будет доступен только из внутренней защищенной сети. Брандмауэр и, возможно, фильтры .Net гарантируют, что незащищенный сервис недоступен за пределами защищенной сети.

Пока мне не удалось получить две конечные точки, работающие с разными параметрами безопасности. Я попробовал одну конфигурацию:

<service name="My.Service">
    <host>
        <baseAddresses>
            <add baseAddress="http://localhost/MyService/"/>
        </baseAddresses>
    </host>
    <endpoint address="UnSecuredAccessToMyService.svc" 
              behaviorConfiguration="restBehavior" 
              name="UnSecureEndpoint" 
              binding="webHttpBinding"
              bindingName="SomeBindingName" 
              bindingNamespace="http://mydomain/myservice" 
              contract="Domain.MyService.MyClass" />
    <endpoint address="SecuredAccessToMyService.svc"
              behaviorConfiguration="secBehavior"
              name="SecuredEnpoint"
              binding="webHttpBinding"
              bindingConfiguration="customSecureBinding"
              bindingName="SecBindingName"
              bindingNamespace="http://mydomain/myservice"
              contract="Domain.MyService.MyClass" />
</service>

<behaviors>
    <endpointBehaviors>
        <behavior name="restBehavior">
            <webHttp />
        </behavior>
        <behavior name="secBehavior">
        </behavior>
    </endpointBehaviors>
</behaviors>

<bindings>
    <webHttpBinding>
        <binding name="customSecureBinding">
            <security mode="Transport">
                <transport clientCredentialType="Basic"/>
            </security>
        </binding>
    </webHttpBinding>
</bindings>

Файлы UnSecuredAccessToMyService.svc и SecuredAccessToMyService.svc выглядят следующим образом:

<%@ ServiceHost
    Factory="somefactory, anotherfactory"
    Service="My.Service, AnotherService"
%>

Я очень новичок в WCF и .Net, поэтому дополнительные детали могут действительно помочь, спасибо!

Ответы [ 2 ]

7 голосов
/ 17 ноября 2010

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

<services>

    <service name="My.Service">
        <endpoint address="UnSecuredAccessToMyService.svc" 
                  binding="webHttpBinding"
                  bindingNamespace="http://mydomain/myservice" 
                  contract="Domain.MyService.MyClass" />

        <endpoint address="SecuredAccessToMyService.svc"
                  binding="webHttpBinding"
                  bindingName="secureWebHttpBinding" 
                  bindingNamespace="http://mydomain/myservice"
                  contract="Domain.MyService.MyClass" />
    </service>

</services>

<bindings>
    <webHttpBinding>
        <binding name="secureWebHttpBinding">
            <security mode="Transport">
                <transport clientCredentialType="Basic"/>
            </security>
        </binding>
    </webHttpBinding>
</bindings>

Это указывает, что обе конечные точки должны использовать WebHttpBinding, но одна будет использовать привязку по умолчанию, а другая будет использовать именованную привязку secureWebHttpBinding, которая настроена для использования безопасности транспортного уровня (SSL) и базовой аутентификации клиента.

Они не должны требовать дальнейшей настройки или настраиваемого поведения, если у вас нет потребностей, выходящих за рамки встроенных по умолчанию.

К сожалению, большая часть WCF отлаживается методом проб и ошибок, пока вы точно не определите, какой элемент работает неправильно. Если информация, которую я вам дал, не работает, укажите больше симптомов вашей проблемы, и я постараюсь оказать дальнейшую помощь.

1 голос
/ 18 февраля 2015

Используйте конфигурацию как

<service name="My.Service">
    <host>
        <baseAddresses>
            <add baseAddress="http://localhost/MyService/UnSecuredAccessToMyService.svc"/>
        </baseAddresses>
    </host>
    <endpoint address="UnSecuredAccessToMyService" 
              behaviorConfiguration="restBehavior" 
              name="UnSecureEndpoint" 
              binding="webHttpBinding"
              bindingName="SomeBindingName" 
              bindingNamespace="http://mydomain/myservice" 
              contract="Domain.MyService.MyClass" />
    <endpoint address="SecuredAccessToMyService"
              behaviorConfiguration="secBehavior"
              name="SecuredEnpoint"
              binding="webHttpBinding"
              bindingConfiguration="customSecureBinding"
              bindingName="SecBindingName"
              bindingNamespace="http://mydomain/myservice"
              contract="Domain.MyService.MyClass" />
</service>

Обратите внимание, что address = "UnSecuredAccessToMyService" и address = "SecuredAccessToMyService" для конечной части, что очень важно. Теперь, когда вы вызываете URl из client , вам нужно вызвать URI как http://localhost/MyService/UnSecuredAccessToMyService.svc/UnSecuredAccessToMyService для незащищенного доступа и http://localhost/MyService/UnSecuredAccessToMyService.svc/SecuredAccessToMyService для защищенного доступа.

BaseAddress должен быть полностью определенным именем, включая .svc

Используя вышеуказанную конфигурацию, вы сможете использовать тот же файл .svc, тот же контракт, ту же операцию / метод, но 2 разные конечные точки, 1 безопасную и 1 незащищенную.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...