У меня есть ряд IIS7-размещенного net.tcp WCF сервисы, которые обслуживают мое веб-приложение MVC ASP.NET. К веб-приложению получают доступ по Интернету.
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>
Вещь состоит в том, что обе привязки, кажется, не хочет, сосуществуют в моем хосте. Когда я удаляю любого из них, все в порядке, но вместе они производят следующее исключение на клиенте:
Требуемое обновление не поддерживается 'сетью tcp://localhost:8081/Service2.svc'. Это могло произойти из-за несогласованной привязки (например, безопасность включила на клиенте а не на сервере).
В журнале трассировки сервера я нахожу следующее исключение:
Заявление Типа протокола было послано в сервис, который не поддерживает тот тип обновления.
Я изучаю правильное направление или являюсь там лучшим способом решить это?
ОБНОВЛЕНИЕ
Хотя этот вопрос, кажется, довольно стар, это все еще относится ко мне (и я думаю другим также). В настоящее время я использую волшебную комбинацию имени пользователя/пароля (потому что текущему принципалу нужно имя пользователя) при доступе к сервисам, которые не должны аутентифицироваться во-первых. В свете этого вопроса Вы видите, что у меня была бы неаутентифицируемая привязка специально для тех услуг общего пользования. В этом случае волшебная учетная запись весьма безопасна, она не обеспечивает доступа кроме на общедоступном уровне.
Я думаю, вам нужно использовать атрибут bindingConfiguration, чтобы указать, какую конфигурацию привязки использовать для каждой конечной точки службы.