Instrukcje: Tworzenie bezpiecznej sesji
Z wyjątkiem podstawowego <powiązaniaHttpBinding> powiązania dostarczone przez system w programie Windows Communication Foundation (WCF) automatycznie używają bezpiecznych sesji po włączeniu zabezpieczeń komunikatów.
Domyślnie bezpieczne sesje nie przetrwają serwera sieci Web, który jest przetwarzany. Po ustanowieniu bezpiecznej sesji klient i usługa buforuje klucz skojarzony z bezpieczną sesją. W miarę wymiany komunikatów wymieniany jest tylko identyfikator buforowanego klucza. W przypadku recyklingu serwera sieci Web pamięć podręczna jest również odzyskiwanych, tak aby serwer sieci Web nie mógł pobrać buforowanego klucza dla identyfikatora. W takim przypadku wyjątek jest zwracany do klienta. Bezpieczne sesje korzystające z stanowego tokenu kontekstu zabezpieczeń (SCT) mogą przetrwać ponowne przetworzenie serwera sieci Web. Aby uzyskać więcej informacji na temat używania stanowego SCT w bezpiecznej sesji, zobacz Instrukcje: tworzenie tokenu kontekstu zabezpieczeń na potrzeby bezpiecznej sesji.
Aby określić, że usługa używa bezpiecznych sesji przy użyciu jednego z powiązań dostarczonych przez system
Skonfiguruj usługę tak, aby korzystała z powiązania dostarczonego przez system, które obsługuje zabezpieczenia komunikatów.
Z wyjątkiem podstawowego <powiązaniaHttpBinding> , gdy powiązania dostarczone przez system są skonfigurowane do korzystania z zabezpieczeń komunikatów, program WCF automatycznie używa bezpiecznych sesji. W poniższej tabeli wymieniono powiązania dostarczone przez system, które obsługują zabezpieczenia komunikatów i czy zabezpieczenia komunikatów są domyślnym mechanizmem zabezpieczeń.
Powiązanie dostarczone przez system Element konfiguracji Zabezpieczenia komunikatów domyślnie włączone BasicHttpBinding <basicHttpBinding> Nie. WSHttpBinding <wsHttpBinding> Tak WSDualHttpBinding <wsDualHttpBinding> Tak WSFederationHttpBinding <wsFederationHttpBinding> Tak NetTcpBinding <Nettcpbinding> Nie. NetMsmqBinding <Netmsmqbinding> Nie. W poniższym przykładzie kodu użyto konfiguracji do określenia powiązania o nazwie
wsHttpBinding_Calculator
, które używa <wsHttpBinding>, zabezpieczeń komunikatów i bezpiecznych sesji.<bindings> <WSHttpBinding> <binding name = "wsHttpBinding_Calculator"> <security mode="Message"> <message clientCredentialType="Windows"/> </security> </binding> </WSHttpBinding> </bindings>
Poniższy przykład kodu określa, że <wsHttpBinding>, zabezpieczenia komunikatów i bezpieczne sesje są używane do zabezpieczania
secureCalculator
usługi.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()
Uwaga
Bezpieczne sesje można wyłączyć dla elementu <wsHttpBinding> , ustawiając
establishSecurityContext
atrybut nafalse
. W przypadku innych powiązań dostarczanych przez system bezpieczne sesje można wyłączyć tylko przez utworzenie powiązania niestandardowego.
Aby określić, że usługa używa bezpiecznych sesji przy użyciu powiązania niestandardowego
Utwórz niestandardowe powiązanie określające, że komunikaty PROTOKOŁU SOAP są chronione przez bezpieczną sesję.
Aby uzyskać więcej informacji na temat tworzenia powiązania niestandardowego, zobacz How to: Customize a System-Provided Binding (Instrukcje: dostosowywanie powiązania dostarczonego przez system).
Poniższy przykład kodu używa konfiguracji do określenia niestandardowego powiązania, które komunikaty używają bezpiecznej sesji.
<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>
Poniższy przykład kodu tworzy niestandardowe powiązanie, które używa MutualCertificate trybu uwierzytelniania do uruchamiania bezpiecznej sesji.
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()