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


Безопасность пользовательской привязки

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

Этот образец состоит из консольной программы клиента (EXE) и консольной программы службы (EXE). Служба реализует дуплексный контракт. Контракт определяется интерфейсом ICalculatorDuplex, который предоставляет математические операции (добавить, вычесть, умножить и разделить). Интерфейс ICalculatorDuplex позволяет клиенту выполнять математические операции, вычисляя результат выполнения в сеансе. Независимо от этого служба может возвратить результаты в интерфейсе ICalculatorDuplexCallback. Для дуплексного контракта требуется сеанс, поскольку необходимо установить контекст для корреляции набора сообщений, передаваемых между клиентом и службой. Определяется пользовательская привязка, которая поддерживает дуплексное взаимодействие и является безопасной.

Примечание.

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

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

  • Обмен данными по протоколу TCP, защищенный с помощью протокола TLS/SSL.

  • Безопасность сообщений Windows.

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

<bindings>
  <!-- Configure a custom binding. -->
  <customBinding>
    <binding name="Binding1">
      <security authenticationMode="SecureConversation"
                 requireSecurityContextCancellation="true">
      </security>
      <textMessageEncoding messageVersion="Soap12WSAddressing10" writeEncoding="utf-8"/>
      <sslStreamSecurity requireClientCertificate="false"/>
      <tcpTransport/>
    </binding>
  </customBinding>
</bindings>

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

<behaviors>
    <serviceBehaviors>
    <behavior name="CalculatorServiceBehavior">
        <serviceMetadata />
        <serviceDebug includeExceptionDetailInFaults="False" />
        <serviceCredentials>
        <serviceCertificate findValue="localhost" storeLocation="LocalMachine" storeName="My" x509FindType="FindBySubjectName"/>
        </serviceCredentials>
    </behavior>
    </serviceBehaviors>
</behaviors>

Кроме того, пользовательская привязка использует безопасность сообщений с типом учетных данных Windows, который является типом учетных данных по умолчанию. Это возможно благодаря элементу привязки security. Если доступен механизм проверки подлинности Kerberos, то проверка подлинности как клиента, так и службы выполняется с использованием безопасности уровня сообщений. Это происходит при выполнении образца в среде Active Directory. Если механизм проверки подлинности Kerberos недоступен, используется проверка подлинности NTLM. NTLM выполняет проверку подлинности клиента при подключении к службе, но не выполняет проверку подлинности службы при подключении к клиенту. Элемент привязки security настраивается на использование SecureConversationauthenticationType, что приводит к созданию сеанса безопасности как на стороне клиента, так и на стороне службы. Это требуется для обеспечения работы дуплексного контракта службы.

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

Press <ENTER> to terminate client.
Result(100)
Result(50)
Result(882.5)
Result(441.25)
Equation(0 + 100 - 50 * 17.65 / 2 = 441.25)

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

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

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

  • Создание сертификата сервера.

    Следующие строки из файла Setup.bat создают используемый в дальнейшем сертификат сервера. Переменная %SERVER_NAME%задает имя сервера. Измените эту переменную, чтобы задать собственное имя сервера. По умолчанию в этом пакетном файле используется имя localhost.

    Сертификат хранится в хранилище CurrentUser для служб, размещенных на веб-сервере.

    echo ************
    echo Server cert setup starting
    echo %SERVER_NAME%
    echo ************
    echo making server cert
    echo ************
    makecert.exe -sr LocalMachine -ss MY -a sha1 -n CN=%SERVER_NAME% -sky exchange -pe
    
  • Установка сертификата сервера в хранилище доверенных сертификатов клиента.

    Следующие строки из файла Setup.bat копируют сертификат сервера в хранилище доверенных лиц клиента. Этот шаг является обязательным, поскольку сертификаты, созданные с помощью программы Makecert.exe, не получают неявного доверия со стороны клиентской системы. Если уже имеется сертификат, имеющий доверенный корневой сертификат клиента, например сертификат, выпущенный корпорацией Майкрософт, выполнять этот шаг по добавлению сертификата сервера в хранилище сертификатов клиента не требуется.

    certmgr.exe -add -r LocalMachine -s My -c -n %SERVER_NAME% -r CurrentUser -s TrustedPeople
    

    Примечание.

    Пакетный файл Setup.bat предназначен для запуска из командной строки Visual Studio 2010. Требуется, чтобы переменная среды MSSDK указывала на каталог, в котором установлен пакет SDK. Эта переменная среды автоматически устанавливается в командной строке Visual Studio 2010.

Настройка, сборка и выполнение образца

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

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

  3. Чтобы запустить пример в конфигурации с одним или несколькими компьютерами, следуйте инструкциям в разделе "Примеры Windows Communication Foundation".

Запуск образца на одном компьютере

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

    Примечание.

    Пакетный файл Setup.bat предназначен для запуска из командной строки Visual Studio. Переменная среды PATH в командной строке Visual Studio указывает на каталог, содержащий исполняемые файлы, необходимые скрипту Setup.bat.

  2. Запустите программу Service.exe из каталога \service\bin.

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

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

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

  1. На компьютере службы выполните следующее.

    1. Создайте на компьютере службы виртуальный каталог с именем servicemodelsamples.

    2. Скопируйте файлы служебной программы из каталога «\inetpub\wwwroot\servicemodelsamples» в виртуальный каталог на компьютере службы. Убедитесь, что скопированы все файлы из подкаталога \bin.

    3. Скопируйте файлы Setup.bat и Cleanup.bat на компьютер службы.

    4. Выполните следующую команду в командной строке разработчика для Visual Studio, открывшейся с правами администратора: Setup.bat service При этом создается сертификат службы с именем субъекта, соответствующим имени компьютера, на котором запущен пакетный файл.

      Примечание.

      Пакетный файл Setup.bat предназначен для запуска из командной строки Visual Studio 2010. Необходимо, чтобы переменная среды path указывала на каталог, в котором установлен пакет SDK. Эта переменная среды автоматически устанавливается в командной строке Visual Studio 2010.

    5. Измените <serviceCertificate> в файле конфигурации Service.exe.config, чтобы отразить имя субъекта сертификата, созданного на предыдущем шаге.

    6. Запустите файл Service.exe из командной строки.

  2. На клиентском компьютере

    1. Скопируйте на клиентский компьютер файлы программы клиента из папки \client\bin\. Также скопируйте файл Cleanup.bat.

    2. Запустите файл Cleanup.bat, чтобы удалить все старые сертификаты из предыдущих образцов.

    3. Экспортируйте сертификат службы, открыв командную строку разработчика для Visual Studio с правами администратора и выполнив следующую команду на компьютере службы (замените %SERVER_NAME% полное имя компьютера, на котором выполняется служба):

      certmgr -put -r LocalMachine -s My -c -n %SERVER_NAME% %SERVER_NAME%.cer
      
    4. Скопируйте файл %SERVER_NAME%.cer на клиентский компьютер (замените %SERVER_NAME% на полное имя компьютера, на котором выполняется служба).

    5. Импортируйте сертификат службы, открыв командную строку разработчика для Visual Studio с правами администратора и выполнив следующую команду на клиентском компьютере (замените %SERVER_NAME% полным именем компьютера, на котором выполняется служба):

      certmgr.exe -add -c %SERVER_NAME%.cer -s -r CurrentUser TrustedPeople
      

      Шаги c, d и e выполнять не обязательно, если сертификат выдан доверенным издателем.

    6. Измените файл конфигурации app.config клиента следующим образом:

      <client>
          <endpoint name="default"
              address="net.tcp://ReplaceThisWithServiceMachineName:8000/ServiceModelSamples/Service"
              binding="customBinding"
              bindingConfiguration="Binding1"
              contract="Microsoft.ServiceModel.Samples.ICalculatorDuplex"
              behaviorConfiguration="CalculatorClientBehavior" />
      </client>
      
    7. Если служба выполняется от имени учетной записи, отличной от NetworkService или LocalSystem, в среде домена, возможно, потребуется изменить идентификацию конечной точки для конечной точки службы в файле App.config клиента, чтобы задать соответствующее имя участника-пользователя или имя участника-службы на основании учетной записи, используемой для выполнения службы. Дополнительные сведения о удостоверении конечной точки см. в разделе "Удостоверение службы и проверка подлинности ".

    8. Запустите файл Client.exe из командной строки.

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

  • После завершения работы образца запустите в папке образцов файл Cleanup.bat.