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