Вопрос по безопасности WCF в клиентском приложении - PullRequest
1 голос
/ 16 сентября 2010

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

У меня проблемы с поиском, как установить безопасность. Они используют безопасность сообщений и клиентские сертификаты.

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

<system.serviceModel>
    <bindings>
        <basicHttpBinding>
            <binding name="CCaRWebServiceSoap11Binding" closeTimeout="00:01:00"
                openTimeout="00:01:00" receiveTimeout="00:01:00" sendTimeout="01:00:00"
                allowCookies="false" bypassProxyOnLocal="false" hostNameComparisonMode="StrongWildcard"
                maxBufferSize="65536" maxBufferPoolSize="524288" maxReceivedMessageSize="65536"
                messageEncoding="Text" textEncoding="utf-8" transferMode="Buffered"
                useDefaultWebProxy="true">
                <readerQuotas maxDepth="32" maxStringContentLength="8192" maxArrayLength="16384"
                    maxBytesPerRead="4096" maxNameTableCharCount="16384" />
                <security mode="None">
                    <transport clientCredentialType="None" proxyCredentialType="None"
                        realm="" />
                    <message clientCredentialType="UserName" algorithmSuite="Default" />
                </security>
            </binding>
        </basicHttpBinding>
        <customBinding>
            <binding name="CCaRWebServiceSoap12Binding">
                <textMessageEncoding maxReadPoolSize="64" maxWritePoolSize="16"
                    messageVersion="Soap12" writeEncoding="utf-8">
                    <readerQuotas maxDepth="32" maxStringContentLength="8192" maxArrayLength="16384"
                        maxBytesPerRead="4096" maxNameTableCharCount="16384" />
                </textMessageEncoding>
                <httpTransport manualAddressing="false" maxBufferPoolSize="524288"
                    maxReceivedMessageSize="65536" allowCookies="false" authenticationScheme="Anonymous"
                    bypassProxyOnLocal="false" hostNameComparisonMode="StrongWildcard"
                    keepAliveEnabled="true" maxBufferSize="65536" proxyAuthenticationScheme="Anonymous"
                    realm="" transferMode="Buffered" unsafeConnectionNtlmAuthentication="false"
                    useDefaultWebProxy="true" />
            </binding>
        </customBinding>
    </bindings>
    <client>
        <endpoint address="serviceEndpoint1address/"
            binding="basicHttpBinding" bindingConfiguration="CCaRWebServiceSoap11Binding"
            contract="CCaRWebServicePortType" name="CCaRWebServiceHttpSoap11Endpoint" />
        <endpoint address="serviceEndpoint2address/"
            binding="customBinding" bindingConfiguration="CCaRWebServiceSoap12Binding"
            contract="CCaRWebServicePortType" name="CCaRWebServiceHttpSoap12Endpoint" />
    </client>
</system.serviceModel>

Меня как-то бросили в этот проект, поэтому WCF для меня несколько чужд.

1 Ответ

2 голосов
/ 16 сентября 2010

У вас есть сервисная ссылка в вашем проекте?Предоставляет ли ваш сервис описание безопасности в WSDL?Если ответы на оба вопроса верны, вы можете просто обновить справочную службу, и ваша конфигурация будет изменена на безопасный режим (если вам повезет).

Что на самом деле означает безопасность для вас?Безопасность сообщений также может означать шифрование и подпись сообщений.Безопасность сообщений не поддерживается в Basic Http Binding.Для пользовательского связывания вы можете начать со следующей конфигурации:

<customBinding> 
  <binding name="CCaRWebServiceSoap12Binding"> 
    <security authenticationMode="MutualCertificate" /> 
    <!-- there is plenty other configuration attributes in security element - 
         you simply have to know what you need -->
    ...
  </binding>
</customBinding>

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

Чем вы установите эти сертификаты в поведении конечной точки:

<behaviors>
  <endpointBehaviors>
    <behavior name="clientBehavior">
      <clientCredentials>
        <clientCertificate findValue="..." storeLocation="CurrentUser" storeName="My" x509FindType="FindBySubjectName" /> 
        <serviceCertificate>
          <defaultCertificate findValue="..." storeLocation="CurrentUser" storeName="TrustedPeople" x509FindType="FindBySubjectName" />
        </serviceCertificate>
      </clientCredentials>
    </behavior>
  </endpointBehaviors>
</behaviors>

В конечной точке вы будете ссылаться на это поведение:

<endpoint address="serviceEndpoint2address/" binding="customBinding" 
  bindingConfiguration="CCaRWebServiceSoap12Binding"        
  contract="CCaRWebServicePortType" name="CCaRWebServiceHttpSoap12Endpoint"
  behaviorConfiguration="clientBehavior" />

Вы также можете установить эти сертификаты из кода на экземпляре прокси.

Имейте в виду, что это только один из многих параметров,Я не говорю, что это будет работать для вас "как есть".Настроить защиту сообщений с помощью сертификатов довольно сложно, особенно если у вас нет описания безопасности в WSDL или служба не написана в WCF.

Вы также можете просмотреть эту статью на MSDN .Он также настраивает клиента.

...