2011-05-17 11 views
-2

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

<service name="generalName"> 
    <endpoint address=...> 
    . 
    . 
    . 
</service> 
<service name="generalName2"> 
    <endpoint address=""...> 
</service> 

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

параметры безопасности для этой службы требуют проверки подлинности Windows, но не включена для приложения IIS, на котором размещена эта служба.

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

Любые советы для меня? Должен ли я просто попробовать написать совершенно отдельную услугу здесь или есть способы обойти это?

+0

Какой ** обязательный ** вы используете ?? –

ответ

3

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

Поскольку это действительно только один сервис с двумя конечными точками, ваш конфиг должен выглядеть примерно так (я выбрал wsHttpBinding как мой образец - адаптироваться по мере необходимости):

<system.serviceModel> 
    <bindings> 
     <wsHttpBinding> 
     <binding name="TransportSec"> 
      <security mode="Transport"> 
      <transport clientCredentialType="Windows" /> 
      </security> 
     </binding> 
     <binding name="MessageSec"> 
      <security mode="Message"> 
      <message clientCredentialType="UserName" /> 
      </security> 
     </binding> 
     </wsHttpBinding> 
    </bindings> 

    <services> 
     <service name="YourService" > 
     <endpoint name="Transport" 
       address="Transport" 
       binding="wsHttpBinding" 
       bindingConfiguration="TransportSec" 
       contract="IYourService" /> 

     <endpoint name="Message" 
       address="Message" 
       binding="wsHttpBinding" 
       bindingConfiguration="MessageSec" 
       contract="IYourService" /> 
     </service> 
    </services> 
    </system.serviceModel> 

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

Эти два конечных пункта, конечно, не могут иметь один и тот же адрес, поэтому вам нужно предоставить два отдельных (относительных) адреса для каждой из конечных точек.

+0

Также не забудьте настроить IIS, чтобы отключить анонимный доступ и включить проверку подлинности Windows только с учетом того, что для примера @marc_s требуется, чтобы идентификатор Windows передавался с каждым запросом на обслуживание. Клиент WCF автоматически предоставит идентификатор Windows, поэтому вам не нужно ничего менять, кроме файла конфигурации. –

+0

@Sixto Saez: это только моя догадка - wsHttpBinding также поддерживает другие способы передачи учетных данных клиента - например, UserName или Certificate и т. Д. –

+0

Правильно, я также предполагал то же самое на основании исключения, которое я видел в вопросе. Благодаря! –

Смежные вопросы