Как обезопасить службу WCF сессией? - PullRequest
2 голосов
/ 24 апреля 2011

Мое признание: я новичок в WCF, я кое-что прочитал об этом, но мне в руки попало менее одной недели.

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

Поскольку служба является критичной ко времени, механизм защиты должен быть как можно более минимальным.

Как сказано выше, у меня нет опыта работы с WCF, поэтому я не знаю, может ли моя идея быть реализована или нет, и какие механизмы широко используются с WCF.

Большое спасибо.

1 Ответ

2 голосов
/ 24 апреля 2011

Рекомендуется использовать сервисы без сеанса, потому что введение сеанса приводит к другим сложностям.

В вашем случае сервис SOAP может быть защищен с помощью сеанса безопасности (контекст безопасности), который обеспечивается WS-SecureConversation, WS- Доверие и т. Д. При использовании любого вида сеанса WCF необходимо повторно использовать один и тот же экземпляр прокси-сервера службы.Сеанс существует между конкретным прокси и экземпляром службы.Как только любой из этих умирает или возникает ошибка соединения, сеанс пропадает, и вы должны открыть новый прокси.

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

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

<bindings>
  <wsHttpBinding>
    <binding name="secured">
      <security mode="Message">
        <message clientCredentialType="UserName" estabilishSecurityContext="true"
                 negotiateServiceCredentials="false" />
      </security>
    </binding>      
  </wsHttpBinding>
</bindings>
<behaviors>
  <serviceBehaviors>
    <behavior name="securedService">
      ...
      <serviceCredentials>
        <!-- Allows configuring how user name and password will be validated -->
        <userNameAuthentication ... />
        <!-- Message security with user name and password credentials requires service certificate -->
        <serviceCertificate ... />
      </serviceCredentials>
    </behavior>
  </serviceBehaviors>
</behaviors>
<services>
  <service name="..." behaviorConfiguration="securedService">
    <endpoint address="" contract="..." binding="wsHttpBinding" 
              bindingConfiguration="secured" />
  </service>
</services>

Это стандартный подход к выполнению этого в WCF с защитой, интегрированной в конвейер безопасности WCF.Любой другой подход в основном сводится к обходу защитного конвейера WCF или изменению защитного конвейера - оба эти подхода могут потребовать много пользовательских разработок.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...