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


Как создать сеанс безопасности

В Windows Communication Foundation (WCF) все предоставляемые системой привязки, за исключением привязки basicHttpBinding Element, автоматически используют безопасные сеансы при включенной безопасности сообщений.

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

Задание использования службой безопасных сеансов с помощью одной из предоставляемых системой привязок

  • Настройте службу на использование предоставляемой системой привязки, поддерживающей безопасность сообщений.

    Если предоставляемые системой привязки настроены на использование безопасности сообщений (за исключением привязки basicHttpBinding Element), WCF автоматически использует безопасные сеансы. В следующей таблице перечислены предоставляемые системой привязки, поддерживающие безопасность сообщений, и указано, является ли безопасность сообщений механизмом безопасности по умолчанию для данной привязки.

    Предоставляемая системой привязка Элемент конфигурации Безопасность сообщений включена по умолчанию

    BasicHttpBinding

    basicHttpBinding Element

    Нет

    WSHttpBinding

    wsHttpBinding Element

    Да

    WSDualHttpBinding

    wsDualHttpBinding Element

    Да

    WSFederationHttpBinding

    wsFederationHttpBinding element

    Да

    NetTcpBinding

    netTcpBinding Element

    Нет

    NetMsmqBinding

    netMsmqBinding Element

    Нет

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

    <bindings>
      <WSHttpBinding>
       <binding name = "wsHttpBinding_Calculator">
         <security mode="Message">
           <message clientCredentialType="Windows"/>
         </security>
        </binding>
      </WSHttpBinding>
    </bindings>
    

    В следующем примере кода задается, что для обеспечения безопасности службы secureCalculator используются элемент wsHttpBinding Element, безопасность сообщений и безопасные сеансы.

    Dim myBinding As New WSHttpBinding()
    myBinding.Security.Mode = SecurityMode.Message
    myBinding.Security.Message.ClientCredentialType = MessageCredentialType.Windows
    
    ' Create the Type instances for later use and the URI for 
    ' the base address.
    Dim contractType As Type = GetType(ICalculator)
    Dim serviceType As Type = GetType(Calculator)
    Dim baseAddress As New Uri("https://localhost:8036/serviceModelSamples/")
    
    ' Create the ServiceHost and add an endpoint, then start
    ' the service.
    Dim myServiceHost As New ServiceHost(serviceType, baseAddress)
    myServiceHost.AddServiceEndpoint(contractType, myBinding, "secureCalculator")
    myServiceHost.Open()
    
    WSHttpBinding myBinding = new WSHttpBinding();
    myBinding.Security.Mode = SecurityMode.Message;
    myBinding.Security.Message.ClientCredentialType =
        MessageCredentialType.Windows;
    
    // Create the Type instances for later use and the URI for 
    // the base address.
    Type contractType = typeof(ICalculator);
    Type serviceType = typeof(Calculator);
    Uri baseAddress = new
        Uri("https://localhost:8036/serviceModelSamples/");
    
    // Create the ServiceHost and add an endpoint, then start
    // the service.
    ServiceHost myServiceHost =
        new ServiceHost(serviceType, baseAddress);
    myServiceHost.AddServiceEndpoint
        (contractType, myBinding, "secureCalculator");
    myServiceHost.Open();
    
    ms733783.note(ru-ru,VS.100).gifПримечание
    Безопасные сеансы для элемента wsHttpBinding Element можно отключить, задав атрибуту establishSecurityContext значение false. Безопасные сеансы для других предоставляемых системой привязок можно отключить, только создав пользовательскую привязку.

Задание использования службой безопасных сеансов с помощью пользовательской привязки

  • Создайте пользовательскую привязку, которая задает, что сообщения SOAP защищаются безопасным сеансом.

    Дополнительные сведения создании пользовательской привязки см. в разделе Как настроить привязку, предоставляемую системой.

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

    <bindings>
      <!-- configure a custom binding -->
      <customBinding>
        <binding name="customBinding_Calculator">
          <security authenticationMode="SecureConversation" />
          <secureConversationBootstrap authenticationMode="SspiNegotiated" />
          <textMessageEncoding messageVersion="Soap12WSAddressing10" writeEncoding="utf-8"/>
          <httpTransport/>
        </binding>
      </customBinding>
    </bindings>
    

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

    Dim security As SecurityBindingElement = SecurityBindingElement.CreateMutualCertificateBindingElement()
    
    ' Use a secure session.
    security = SecurityBindingElement.CreateSecureConversationBindingElement(security, True)
    
    ' Specify whether derived keys are required.
    security.SetKeyDerivation(True)
    
    ' Create the custom binding.
    Dim myBinding As New CustomBinding(security, New HttpTransportBindingElement())
    
    ' Create the Type instances for later use and the URI for 
    ' the base address.
    Dim contractType As Type = GetType(ICalculator)
    Dim serviceType As Type = GetType(Calculator)
    Dim baseAddress As New Uri("https://localhost:8036/serviceModelSamples/")
    
    ' Create the ServiceHost and add an endpoint, then start
    ' the service.
    Dim myServiceHost As New ServiceHost(serviceType, baseAddress)
    myServiceHost.AddServiceEndpoint(contractType, myBinding, "secureCalculator")
    myServiceHost.Open()
    
    SecurityBindingElement security = SecurityBindingElement.CreateMutualCertificateBindingElement();
    
    // Use a secure session.
    security = SecurityBindingElement.CreateSecureConversationBindingElement(security, true);
    
    // Specify whether derived keys are required.
    security.SetKeyDerivation(true);
    
    // Create the custom binding.
    CustomBinding myBinding = new CustomBinding(security, new HttpTransportBindingElement());
    
    // Create the Type instances for later use and the URI for 
    // the base address.
    Type contractType = typeof(ICalculator);
    Type serviceType = typeof(Calculator);
    Uri baseAddress = new
        Uri("https://localhost:8036/serviceModelSamples/");
    
    // Create the ServiceHost and add an endpoint, then start
    // the service.
    ServiceHost myServiceHost =
        new ServiceHost(serviceType, baseAddress);
    myServiceHost.AddServiceEndpoint
        (contractType, myBinding, "secureCalculator");
    myServiceHost.Open();
    

См. также

Основные понятия

Общие сведения о привязках Windows Communication Foundation