Udostępnij za pośrednictwem


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 na false. 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()
    

Zobacz też