WCF - Encyrption (и, возможно, аутентификация) с использованием SSL - PullRequest
0 голосов
/ 02 мая 2011

Вот мой сценарий и проблема:

  • У нас есть Windows 2008 R2 Server (IIS7)
  • Сертификация SSL
  • .NET 4

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

Из того, что я понял, мне нужно сделать следующее:

  • [ServiceContract(ProtectionLevel = ProtectionLevel.EncryptAndSign)]
  • Использовать WSHttpBinding

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


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

Если существует фактическое, полностью завершено (то есть не частичная информация), это было бы здорово.Или, если кто-то знает необходимые параметры клиент / сервер App.config / Web.config для использования, это также было бы неплохо.

1 Ответ

0 голосов
/ 03 мая 2011

Полагаю, вы хотите использовать HTTPS, который обеспечит шифрование и подпись на транспортном уровне. Сначала необходимо настроить IIS7.5 с сертификатом SSL и разрешить https в приложении, в котором размещается служба. Отметьте этот учебник , но вы будете использовать свой существующий сертификат вместо создания собственной подписи. Ваш сертификат должен быть создан для заголовка узла вашего сайта (например, mydomain.com) или для имени вашего сервера, если он выставлен напрямую.

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

<bindings>
  <basicHttpBinding>
    <binding name="secured">
      <security mode="TransportWithMessageCredential">
        <message clientCredentialType="UserName" />
      </security>
    </binding>
  </basicHttpBinding>
</bindings>
<behaviors>
  <serviceBehaviors>
    <behavior name="securedService">
    <serviceMetadata httpsGetEnabled="true" />
      <serviceCredentials>
        <userNameAuthentication userNamePasswordValidationMode="Custom" userNamePasswordValidator="..." />
      </serviceCredentials>
    </behavior>
  </serviceBehaviors>
</behaviors>
<services>
  <service name="..." behaviorConfiguration="securedService">
    <endpoint address="" contract="..." binding="basicHttpBinding" bindingConfiguration="secured" />
    <endpoint address="mex" contract="IMetadataExchange" binding="mexHttpsBinding" />
  </service>
</services>

Клиент будет использовать аналогичные настройки:

<bindings>
  <basicHttpBinding>
    <binding name="secured">
      <security mode="TransportWithMessageCredential">
        <message clientCredentialType="UserName" />
      </security>
    </binding>
  </basicHttpBinding>
</bindings>
<client>
  <endpoint name="..." address="https://..." contract="..." binding="basicHttpBinding" bindingConfiguration="secured" />
</client>

Эта конфигурация определяет службу SOAP 1.1, соответствующую защищенному протоколу HTTPS и защищенному именем пользователя и паролем. Сервис также предоставляет свои метаданные (WSDL) через HTTPS. Имя пользователя и пароль проверяются с помощью специального средства проверки пароля (вам нужно внедрить один ).

Вы будете устанавливать учетные данные на клиенте (сгенерированные путем добавления ссылки на услугу):

var client = new MyServiceClient();
client.ClientCredentials.UserName.UserName = "Name";
client.CleintCredentials.UserName.Password = "Password";

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

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

Не используйте пользовательскую аутентификацию, которую вы описали:

Схема аутентификации проверит пользователь / передать в первый раз аутентификация. Затем с тех пор клиент будет использовать случайно сгенерированный вместо этого используйте код для аутентификации.

Это намного сложнее. Вы либо накатите свое собственное решение, которое будет нестандартным, либо будете использовать встроенную реализацию WCF (безопасный диалог), но не каждый клиентский стек SOAP может использовать такую ​​услугу (это полностью зависит от расширенной безопасности сообщений).

...