Udostępnij za pośrednictwem


Instrukcje: Tworzenie tokenu kontekstu zabezpieczeń dla bezpiecznej sesji

Korzystając z stanowego tokenu kontekstu zabezpieczeń (SCT) w bezpiecznej sesji, sesja może wytrzymać ponowne przetworzenie usługi. Na przykład gdy w bezpiecznej sesji jest używany bezstanowy protokół SCT, a usługi Internet Information Services (IIS) są resetowane, dane sesji skojarzone z usługą zostaną utracone. Te dane sesji zawierają pamięć podręczną tokenów SCT. Dlatego przy następnym wysłaniu przez klienta usługi bezstanowego SCT zostanie zwrócony błąd, ponieważ nie można pobrać klucza skojarzonego z SCT. Jeśli jednak jest używany stanowy SCT, klucz skojarzony z SCT jest zawarty w SCT. Ponieważ klucz jest zawarty w SCT i w ten sposób zawarty w komunikacie, bezpieczna sesja nie ma wpływu na usługę, która jest odzyskiwana. Domyślnie program Windows Communication Foundation (WCF) używa bezstanowych protokołów SCTs w bezpiecznej sesji. W tym temacie opisano sposób używania stanowych scTs w bezpiecznej sesji.

Uwaga

Stanowych scTs nie można używać w bezpiecznej sesji, która obejmuje kontrakt, który pochodzi z IDuplexChannel.

Uwaga

W przypadku aplikacji korzystających ze stanowych scTs w bezpiecznej sesji tożsamość wątku dla usługi musi być kontem użytkownika, które ma skojarzony profil użytkownika. Gdy usługa jest uruchamiana na koncie, które nie ma profilu użytkownika, takiego jak Local Service, może zostać zgłoszony wyjątek.

Uwaga

Jeśli personifikacja jest wymagana w systemie Windows XP, należy użyć bezpiecznej sesji bez stanowego SCT. Gdy stanowe scTs są używane z personifikacją, InvalidOperationException jest zgłaszany. Aby uzyskać więcej informacji, zobacz Nieobsługiwane scenariusze.

Aby używać stanowych scTs w bezpiecznej sesji

  • Utwórz niestandardowe powiązanie określające, że komunikaty PROTOKOŁU SOAP są chronione przez bezpieczną sesję korzystającą z stanowego protokołu SCT.

    1. Zdefiniuj powiązanie niestandardowe, dodając <element customBinding> do pliku konfiguracji dla usługi.

      <customBinding>  
      </customBinding>
      
    2. Dodaj element podrzędny <powiązania> do <elementu customBinding>.

      Określ nazwę powiązania, ustawiając name atrybut na unikatową nazwę w pliku konfiguracji.

      <binding name="StatefulSCTSecureSession">  
      </binding>
      
    3. Określ tryb uwierzytelniania komunikatów wysyłanych do i z tej usługi, dodając element podrzędny zabezpieczeń> do <elementu customBinding>.<

      Określ, że bezpieczna sesja jest używana przez ustawienie atrybutu authenticationMode na SecureConversation. Określ, że stanowe scTs są używane przez ustawienie atrybutu requireSecurityContextCancellation na false.

      <security authenticationMode="SecureConversation"  
                requireSecurityContextCancellation="false">
      </security>
      
    4. Określ sposób uwierzytelniania klienta podczas ustanawiania bezpiecznej sesji przez dodanie <elementu podrzędnego secureConversationBootstrap> do zabezpieczeń<>.

      Określ sposób uwierzytelniania klienta, ustawiając authenticationMode atrybut .

      <secureConversationBootstrap authenticationMode="UserNameForCertificate" />  
      
    5. Określ kodowanie komunikatów, dodając element kodowania, taki jak <textMessageEncoding>.

      <textMessageEncoding />  
      
    6. Określ transport, dodając element transportu, taki jak httpTransport>.<

      <httpTransport />  
      

    Poniższy przykład kodu używa konfiguracji do określenia niestandardowego powiązania, którego komunikaty mogą używać z stanowymi scTs w bezpiecznej sesji.

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

Przykład

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 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()

Gdy uwierzytelnianie systemu Windows jest używane w połączeniu z stanowym SCT, WCF nie wypełnia WindowsIdentity właściwości tożsamości rzeczywistego obiektu wywołującego, ale zamiast tego ustawia właściwość na anonimową. Ponieważ zabezpieczenia WCF muszą ponownie utworzyć zawartość kontekstu zabezpieczeń usługi dla każdego żądania przychodzącego SCT, serwer nie śledzi sesji zabezpieczeń w pamięci. Ponieważ nie można serializować WindowsIdentity wystąpienia w SCT, WindowsIdentity właściwość zwraca tożsamość anonimową.

Poniższa konfiguracja wykazuje to zachowanie.

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

Zobacz też