Практическое руководство. Создание сеанса безопасности
За исключением базовой <привязкиHttpBinding> , предоставляемые системой привязки в Windows Communication Foundation (WCF) автоматически используют безопасные сеансы при включении безопасности сообщений.
По умолчанию безопасные сеансы не сохраняются на перезапускаемом веб-сервере. После установления безопасного сеанса клиент и служба кэшируют ключ, связанный с безопасным сеансом. При обмене сообщениями происходит только обмен идентификатором кэшированного ключа. При перезапуске веб-сервера кэш также перезапускается, следовательно, веб-сервер не может извлечь кэшированный ключ для идентификатора. В этом случае исключение передается назад клиенту. Безопасные сеансы, использующие токен контекста безопасности с отслеживанием состояния (SCT), сохраняются при перезапуске веб-сервера. Дополнительные сведения об использовании SCT с отслеживанием состояния в безопасном сеансе см. в разделе "Практическое руководство. Создание маркера контекста безопасности для безопасного сеанса".
Задание использования службой безопасных сеансов с помощью одной из предоставляемых системой привязок
Настройте службу на использование предоставляемой системой привязки, поддерживающей безопасность сообщений.
За исключением базовой <привязкиHttpBinding> , если системные привязки настроены для использования безопасности сообщений, WCF автоматически использует безопасные сеансы. В следующей таблице перечислены предоставляемые системой привязки, поддерживающие безопасность сообщений, и указано, является ли безопасность сообщений механизмом безопасности по умолчанию для данной привязки.
Предоставляемая системой привязка Элемент конфигурации Безопасность сообщений включена по умолчанию BasicHttpBinding <basicHttpBinding> No WSHttpBinding <wsHttpBinding> Да WSDualHttpBinding <wsDualHttpBinding> Да WSFederationHttpBinding <wsFederationHttpBinding> Да NetTcpBinding <Nettcpbinding> No NetMsmqBinding <Netmsmqbinding> No В следующем примере кода используется конфигурация для указания привязки с именем
wsHttpBinding_Calculator
, которая использует <wsHttpBinding>, безопасность сообщений и безопасные сеансы.<bindings> <WSHttpBinding> <binding name = "wsHttpBinding_Calculator"> <security mode="Message"> <message clientCredentialType="Windows"/> </security> </binding> </WSHttpBinding> </bindings>
В следующем примере кода указывается, что <для защиты
secureCalculator
службы используются wsHttpBinding>, безопасность сообщений и безопасные сеансы.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("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 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("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()
Примечание.
Безопасные сеансы можно отключить для wsHttpBinding>, установив для атрибута
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 для начальной загрузки безопасного сеанса.
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("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. 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("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()