Как настроить несколько конфигураций привязки WCF для одной схемы - PullRequest
5 голосов
/ 23 апреля 2010

У меня есть набор служб WCF net.tcp, расположенных на IIS7, которые обслуживают мое веб-приложение ASP.NET MVC. Доступ к веб-приложению осуществляется через Интернет.

WCF Services (IIS7) <--> ASP.NET MVC Application <--> Client Browser

Службы проходят проверку подлинности по имени пользователя. Учетная запись, используемая клиентом (моего веб-приложения) для входа в систему, заканчивается в качестве текущего участника на хосте.

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

Дело не в этом. Использование нескольких привязок TCP - вот что доставляет мне проблемы. Я попытался настроить его так в моей конфигурации клиента:

<bindings>
  <netTcpBinding>
    <binding>
      <security mode="TransportWithMessageCredential">
        <message clientCredentialType="UserName"/>
      </security>
    </binding>
    <binding name="public">
      <security mode="Transport">
        <message clientCredentialType="Windows"/>
      </security>
    </binding>
  </netTcpBinding>
</bindings>

<client>
  <endpoint contract="Server.IService1" binding="netTcpBinding" address="net.tcp://localhost:8081/Service1.svc"/>
  <endpoint contract="Server.IService2" binding="netTcpBinding" bindingConfiguration="public" address="net.tcp://localhost:8081/Service2.svc"/>
</client>

Конфигурация сервера такова:

<bindings>
  <netTcpBinding>
    <binding portSharingEnabled="true">
      <security mode="TransportWithMessageCredential">
        <message clientCredentialType="UserName"/>
      </security>
    </binding>
    <binding name="public">
      <security mode="Transport">
        <message clientCredentialType="Windows"/>
      </security>
    </binding>
  </netTcpBinding>
</bindings>

<services>
  <service name="Service1">
    <endpoint contract="Server.IService1, Library" binding="netTcpBinding" address=""/>
  </service>
  <service name="Service2">
    <endpoint contract="Server.IService2, Library" binding="netTcpBinding" bindingConfiguration="public" address=""/>
  </service>
</services>

<serviceHostingEnvironment>
  <serviceActivations>
    <add relativeAddress="Service1.svc" service="Server.Service1"/>
    <add relativeAddress="Service2.svc" service="Server.Service2"/>
  </serviceActivations>
</serviceHostingEnvironment>

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

Запрошенное обновление не поддерживается 'net.tcp: // localhost: 8081 / Service2.svc'. Это может быть связано с несовпадающими привязками (например, защита включена на клиенте, а не на сервере).

В журнале трассировки сервера я нахожу следующее исключение:

Приложение типа протокола / переговоры было отправлено в службу, которая не поддерживает этот тип обновления.

Я смотрю в правильном направлении или есть лучший способ решить эту проблему?

UPDATE

Хотя этот вопрос кажется довольно старым, он все еще актуален для меня (и я думаю, также для других). В настоящее время я использую волшебную комбинацию имени пользователя и пароля (потому что текущему принципалу требуется имя пользователя) при доступе к службам, которые не должны быть аутентифицированы в первую очередь. В свете этого вопроса вы можете видеть, что я предпочел бы иметь обязательную проверку без аутентификации специально для этих публичных сервисов. В этом случае магическая учетная запись не является небезопасной, она не предоставляет никакого доступа, кроме как на общедоступном уровне.

Ответы [ 2 ]

4 голосов
/ 19 июля 2012

Попробуйте включить службу для использования нескольких привязок:

<serviceHostingEnvironment multipleSiteBindingsEnabled="true" />
0 голосов
/ 24 апреля 2010

Я думаю, вам нужно использовать атрибут 'bindingConfiguration', чтобы указать, какую конфигурацию привязки использовать для каждой конечной точки службы.

...