Поделиться через


Пример безопасности сообщений

В примере MessageSecurity показано, как реализовать приложение, которое использует безопасность сообщений и basicHttpBinding. Этот пример основан на руководстве «Начало работы», которое реализует сервис калькулятора.

Замечание

Процедура установки и инструкции по сборке для этого примера находятся в конце этого раздела.

Режим безопасности basicHttpBinding можно задать следующими значениями: Message, , TransportTransportWithMessageCredentialи TransportCredentialOnlyNone. В следующем примере файла службы App.config определение конечной точки указывает basicHttpBinding и ссылается на конфигурацию привязки с именем Binding1, как показано в следующем примере конфигурации:

<system.serviceModel>
  <services>
    <service name="Microsoft.ServiceModel.Samples.CalculatorService"
             behaviorConfiguration="CalculatorServiceBehavior">
     <!-- This endpoint is exposed at the base address provided by -->
     <!-- host: http://localhost:8000/ServiceModelSamples/service.-->
     <endpoint address=""
               binding="basicHttpBinding"
               bindingConfiguration="Binding1"
               contract="Microsoft.ServiceModel.Samples.ICalculator" />
    </service>
  </services>
  ...
</system.serviceModel>

Конфигурация привязки задает атрибут mode для <безопасности> на Message и атрибут clientCredentialType для <сообщения> на Certificate, как показано в следующем примере конфигурации:

<bindings>
  <basicHttpBinding>
    <!--
        This configuration defines the SecurityMode as Message and
        the clientCredentialType as Certificate.
        -->
    <binding name="Binding1" >
      <security mode = "Message">
        <message clientCredentialType="Certificate"/>
      </security>
    </binding>
  </basicHttpBinding>
</bindings>

Сертификат, который служба использует для проверки подлинности в клиенте, устанавливается в разделе поведения файла конфигурации в элементе serviceCredentials . Режим проверки, который применяется к сертификату, который клиент использует для проверки подлинности в службе, также устанавливается в разделе поведения в элементе clientCertificate .

<!--For debugging purposes, set the includeExceptionDetailInFaults attribute to true.-->
<behaviors>
  <serviceBehaviors>
    <behavior name="CalculatorServiceBehavior">
      <serviceMetadata httpGetEnabled="True"/>
      <serviceDebug includeExceptionDetailInFaults="False" />
      <!--The serviceCredentials behavior allows one to define a -->
      <!--service certificate. A service certificate is used by a -->
      <!--client to authenticate the service and provide message -->
      <!-- protection. This configuration references the "localhost"-->
      <!--certificate installed during the setup instructions. -->
      <serviceCredentials>
        <serviceCertificate findValue="localhost"
               storeLocation="LocalMachine"
               storeName="My" x509FindType="FindBySubjectName" />
        <clientCertificate>
          <!-- Setting the certificateValidationMode to -->
          <!-- PeerOrChainTrust means that if the certificate -->
          <!--is in the user's Trusted People store, then it is -->
          <!-- trusted without performing a validation of the -->
          <!-- certificate's issuer chain. This setting is used -->
          <!-- here for convenience so that the sample can be run -->
          <!-- without having to have certificates issued by a -->
          <!-- certification authority (CA). -->
          <!-- This setting is less secure than the default, -->
          <!-- ChainTrust. The security implications of this -->
          <!-- setting should be carefully considered before using -->
          <!-- PeerOrChainTrust in production code. -->
          <authentication
                       certificateValidationMode="PeerOrChainTrust" />
        </clientCertificate>
      </serviceCredentials>
    </behavior>
  </serviceBehaviors>
</behaviors>

Те же сведения о привязке и безопасности указаны в файле конфигурации клиента.

Идентификация вызывающего абонента отображается в окне консоли службы с использованием следующего кода.

Console.WriteLine("Called by {0}", ServiceSecurityContext.Current.PrimaryIdentity.Name);

При запуске примера запросы и ответы операции отображаются в окне консоли клиента. Нажмите клавишу ВВОД в окне клиента, чтобы завершить работу клиента.

Add(100,15.99) = 115.99
Subtract(145,76.54) = 68.46
Multiply(9,81.25) = 731.25
Divide(22,7) = 3.14285714285714
Press <ENTER> to terminate client.

Для настройки и сборки примера

  1. Убедитесь, что вы выполнили процедуру настройки One-Time для образцов Windows Communication Foundation.

  2. Чтобы создать версию решения на C# или Visual Basic .NET, следуйте инструкциям по сборке примеров Windows Communication Foundation .

Запуск примера на том же компьютере

  1. Запустите Setup.bat из папки установки примера. При этом устанавливаются все сертификаты, необходимые для выполнения примера.

    Замечание

    Пакетный файл Setup.bat предназначен для запуска из командной строки Пакета SDK для Windows. Для этого необходимо, чтобы переменная среды MSSDK указывала на каталог, в котором установлен пакет SDK. Эта переменная среды автоматически устанавливается в командной строке пакета SDK для Windows.

  2. Запустите приложение-службу из \service\bin.

  3. Запустите клиентское приложение из \client\bin. Действие клиента отображается в клиентском консольном приложении.

  4. Если клиент и служба не могут взаимодействовать, см. рекомендации по устранению неисправностей для примеров WCF.

  5. Удалите сертификаты, выполнив Cleanup.bat после завершения работы с образцом. Другие примеры безопасности используют те же сертификаты.

Запуск примера на разных компьютерах

  1. Создайте каталог на сервере службы для бинарных файлов службы.

  2. Скопируйте файлы программы службы в каталог службы на сервере. Кроме того, скопируйте Setup.bat, Cleanup.batи ImportClientCert.bat файлы на сервер.

  3. Создайте каталог на клиентском компьютере для двоичных файлов клиента.

  4. Скопируйте файлы клиентской программы в каталог клиента на клиентском компьютере. Кроме того, скопируйте Setup.bat, Cleanup.batи ImportServiceCert.bat файлы в клиент.

  5. На сервере запустите setup.bat service. При выполнении setup.bat с аргументом service создается сертификат службы, используя полное доменное имя компьютера, и затем этот сертификат экспортируется в файл с именем Service.cer.

  6. Измените Service.exe.config, чтобы отразить новое имя сертификата (в findValue атрибуте в <элементе ServiceCertificate> ), которое совпадает с полным доменным именем компьютера. Также измените значение базового адреса, чтобы указать полное имя компьютера вместо localhost.

  7. Скопируйте файл Service.cer из каталога службы в клиентский каталог на клиентском компьютере.

  8. На клиенте запустите setup.bat client. При выполнении setup.bat с аргументом client создается сертификат клиента с именем client.com и экспортируется сертификат клиента в файл с именем Client.cer.

  9. В файле Client.exe.config на клиентском компьютере измените значение адреса конечной точки, чтобы он соответствовал новому адресу службы. Для этого замените localhost полным доменным именем сервера. Также измените findValue атрибут <defaultCertificate> на новое имя сертификата службы, которое является полным доменным именем сервера.

  10. Скопируйте файл Client.cer из клиентского каталога в каталог службы на сервере.

  11. На клиенте запустите ImportServiceCert.bat. При этом сертификат службы импортируется из файла Service.cer в хранилище CurrentUser — TrustedPeople.

  12. На сервере запустите ImportClientCert.bat. Это импортирует сертификат клиента из файла Client.cer в хранилище LocalMachine — TrustedPeople.

  13. На компьютере службы запустите Service.exe из командной строки.

  14. На клиентском компьютере запустите Client.exe из окна командной строки.

    1. Если клиент и служба не могут взаимодействовать, см. рекомендации по устранению неисправностей для примеров WCF.

Очистка после образца

  • Запустите Cleanup.bat в папке примеров после завершения работы примера.

    Замечание

    Этот скрипт не удаляет сертификаты службы на клиенте при запуске этого примера на компьютерах. Если вы запускали примеры Windows Communication Foundation (WCF), использующие сертификаты между машинами, обязательно очистите сертификаты службы, установленные в хранилище CurrentUser — TrustedPeople. Для этого используйте следующую команду: например: certmgr -del -r CurrentUser -s TrustedPeople -c -n <Fully Qualified Server Machine Name>certmgr -del -r CurrentUser -s TrustedPeople -c -n server1.contoso.com