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


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

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

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

ms751528.note(ru-ru,VS.100).gifПримечание
Процедура установки и инструкции по построению для данного образца приведены в конце этого раздела.

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

  • Обмен данными по протоколу 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 настраивается на использование SecureConversation authenticationType, что приводит к созданию сеанса безопасности как на стороне клиента, так и на стороне службы. Это требуется для обеспечения работы дуплексного контракта службы.

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

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
    
    ms751528.note(ru-ru,VS.100).gifПримечание
    Пакетный файл Setup.bat предназначен для запуска из командной строки Visual Studio 2010. Требуется, чтобы переменная среды MSSDK указывала на каталог, в котором установлен пакет SDK. Эта переменная среды автоматически устанавливается в командной строке Visual Studio 2010.

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

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

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

  3. Чтобы запустить образец на одном или нескольких компьютерах, следуйте инструкциям в разделе Running the Windows Communication Foundation Samples.

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

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

    ms751528.note(ru-ru,VS.100).gifПримечание
    Пакетный файл Setup.bat предназначен для запуска из командной строки Visual Studio 2010. Переменная среды PATH, заданная в командной строке Visual Studio 2010, указывает на каталог, содержащий исполняемые файлы, необходимые для скрипта Setup.bat.

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

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

  4. Если клиенту и службе не удается взаимодействовать, см. раздел Troubleshooting Tips.

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

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

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

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

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

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

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

    5. Измените serviceCertificate element of serviceCredentials в файле 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.