Как создать маркер контекста безопасности с отслеживанием состояния для безопасного сеанса

При использовании в безопасном сеансе маркера контекста безопасности (SCT) с отслеживанием состояния сеанс может сохраняться и при перезапуске службы. Например, если в безопасном сеансе используется маркер SCT без учета состояния, то при сбросе служб IIS данные сеанса, связанного со службой, будут потеряны. В состав данных сеанса входит кэш маркера SCT. Поэтому в следующий раз, когда клиент отправляет в службу маркер SCT без учета состояния, возвращается ошибка, так как невозможно извлечь ключ, связанный с этим маркером SCT. Однако если используется маркер SCT с отслеживанием состояния, то ключ, связанный с маркером SCT, содержится в этом маркере SCT. Так как ключ содержится в маркере SCT и, следовательно, в сообщении, перезапуск службы не влияет на безопасный сеанс. По умолчанию Windows Communication Foundation (WCF) использует без отслеживания состояния scTs в безопасном сеансе. В этом разделе описывается, как использовать в безопасном сеансе маркеры SCT с отслеживанием состояния.

Примечание.

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

Примечание.

Для приложений, использующих в безопасных сеансах маркеры SCT с отслеживанием состояния, идентификатором потока для службы должна быть учетная запись пользователя, имеющая связанный с ней профиль пользователя. Если служба запущена с учетной записью, не имеющей профиля пользователя (например, Local Service), возможно возникновение исключения.

Примечание.

Если в ОС Windows XP требуется олицетворение, следует использовать безопасный сеанс без маркера SCT с отслеживанием состояния. При использовании маркеров SCT с отслеживанием состояния вместе с олицетворением возникает исключение InvalidOperationException. Дополнительные сведения см. в разделе "Неподдерживаемые сценарии".

Использование маркеров SCT с отслеживанием состояния в безопасном сеансе

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

    1. Определите пользовательскую привязку, добавив <customBinding> в файл конфигурации для службы.

      <customBinding>  
      </customBinding>
      
    2. Добавьте дочерний элемент привязки> в< customBinding>.<

      Укажите имя привязки, задав для атрибута name имя, уникальное в пределах этого файла конфигурации.

      <binding name="StatefulSCTSecureSession">  
      </binding>
      
    3. Укажите режим проверки подлинности для сообщений, отправляемых в эту службу, добавив дочерний элемент безопасности> в< customBinding>.<

      Укажите, что используется безопасный сеанс, задав для атрибута authenticationMode значение SecureConversation. Укажите, что используются маркеры SCT с отслеживанием состояния, задав для атрибута requireSecurityContextCancellation значение false.

      <security authenticationMode="SecureConversation"  
                requireSecurityContextCancellation="false">
      </security>
      
    4. Укажите способ проверки подлинности клиента во время установки безопасного сеанса путем добавления дочернего элемента secureConversationBootstrap> в <безопасность>.<

      Укажите, как производится проверка подлинности клиента, задав атрибут authenticationMode.

      <secureConversationBootstrap authenticationMode="UserNameForCertificate" />  
      
    5. Укажите кодировку сообщения, добавив элемент кодирования, например textMessageEncoding>.<

      <textMessageEncoding />  
      
    6. Укажите транспорт, добавив элемент транспорта, например httpTransport>.<

      <httpTransport />  
      

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

    <customBinding>  
      <binding name="StatefulSCTSecureSession">  
        <security authenticationMode="SecureConversation"  
                  requireSecurityContextCancellation="false">  
          <secureConversationBootstrap authenticationMode="UserNameForCertificate" />  
        </security>  
        <textMessageEncoding />  
        <httpTransport />  
      </binding>  
    </customBinding>  
    

Пример

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

SecurityBindingElement security = SecurityBindingElement.CreateMutualCertificateBindingElement();

// Use a secure session and specify that stateful SecurityContextToken security tokens are used.
security = SecurityBindingElement.CreateSecureConversationBindingElement(security, false);

// Specify whether derived keys are needed.
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("http://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();
Dim security As SecurityBindingElement = SecurityBindingElement.CreateMutualCertificateBindingElement()


' Use a secure session and specify that stateful SecurityContextToken security tokens are used.
security = SecurityBindingElement.CreateSecureConversationBindingElement(security, False)

' Specify whether derived keys are needed.      
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("http://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()

Если проверка подлинности Windows используется в сочетании с SCT с отслеживанием состояния, WCF не заполняет WindowsIdentity свойство удостоверением фактического вызывающего объекта, а вместо этого задает для свойства анонимное значение. Так как безопасность WCF должна повторно создать содержимое контекста безопасности службы для каждого запроса из входящего SCT, сервер не отслеживает сеанс безопасности в памяти. Поскольку выполнить сериализацию экземпляра WindowsIdentity в маркер SCT невозможно, свойство WindowsIdentity возвращает анонимный идентификатор.

Следующая конфигурация демонстрирует это расширение функциональности.

<customBinding>  
  <binding name="Cancellation">  
       <textMessageEncoding />  
        <security
            requireSecurityContextCancellation="false">  
              <secureConversationBootstrap />  
        </security>  
    <httpTransport />  
  </binding>  
</customBinding>  

См. также