Share via


Postupy: Vytvoření tokenu kontextu zabezpečení pro zabezpečenou relaci

Použitím tokenu SCT (Stateful Security Context Token) v zabezpečené relaci může relace odolat recyklaci služby. Pokud se například v zabezpečené relaci použije bezstavový SCT a Internetová informační služba (IIS) se resetuje, dojde ke ztrátě dat relace přidružených ke službě. Tato data relace zahrnují mezipaměť tokenů SCT. Takže při příštím odeslání služby bezstavový SCT se vrátí chyba, protože klíč přidružený k SCT nelze načíst. Pokud se však použije stavová SCT, klíč, který je přidružený k SCT, je obsažen v SCT. Vzhledem k tomu, že klíč je obsažen v SCT, a proto je obsažen ve zprávě, není zabezpečená relace ovlivněna recyklovanou službou. Windows Communication Foundation (WCF) ve výchozím nastavení používá bezstavové scT v zabezpečené relaci. Toto téma podrobně popisuje, jak používat stavové SCT v zabezpečené relaci.

Poznámka:

Stavové SCT nelze použít v zabezpečené relaci, která zahrnuje kontrakt, který je odvozen z IDuplexChannel.

Poznámka:

Pro aplikace, které používají stavové SCT v zabezpečené relaci, musí být identita vlákna pro službu uživatelským účtem, který má přidružený profil uživatele. Pokud je služba spuštěna pod účtem, který nemá profil uživatele, například Local Service, může být vyvolán výjimka.

Poznámka:

Pokud je v systému Windows XP vyžadováno zosobnění, použijte zabezpečenou relaci bez stavového SCT. Pokud se stavové scT používají s zosobněním, vyvolá se chyba InvalidOperationException . Další informace najdete v tématu Nepodporované scénáře.

Použití stavových scT v zabezpečené relaci

  • Vytvořte vlastní vazbu, která určuje, že zprávy SOAP jsou chráněny zabezpečenou relací, která používá stavový SCT.

    1. Definujte vlastní vazbu přidáním vlastní vazby <> do konfiguračního souboru služby.

      <customBinding>  
      </customBinding>
      
    2. Přidání podřízeného elementu <vazby >< do customBinding>

      Zadejte název vazby nastavením atributu name na jedinečný název v rámci konfiguračního souboru.

      <binding name="StatefulSCTSecureSession">  
      </binding>
      
    3. Zadejte režim ověřování pro zprávy odeslané do a z této služby přidáním podřízeného prvku zabezpečení> do <customBinding>.<

      Určete, že se zabezpečená relace používá nastavením atributu authenticationMode na SecureConversationhodnotu . Určete, že stavové SCT se používají nastavením atributu requireSecurityContextCancellation na falsehodnotu .

      <security authenticationMode="SecureConversation"  
                requireSecurityContextCancellation="false">
      </security>
      
    4. Určete, jak se klient ověřuje při vytvoření zabezpečené relace přidáním podřízeného <elementu secureConversationBootstrap> do< zabezpečení>.

      Určete, jak se klient ověřuje nastavením atributu authenticationMode .

      <secureConversationBootstrap authenticationMode="UserNameForCertificate" />  
      
    5. Zadejte kódování zpráv přidáním elementu kódování, například textMessageEncoding>.<

      <textMessageEncoding />  
      
    6. Určete přenos přidáním přenosového prvku, například httpTransport>.<

      <httpTransport />  
      

    Následující příklad kódu používá konfiguraci k určení vlastní vazby, kterou zprávy mohou používat se stavovými SCTs v zabezpečené relaci.

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

Příklad

Následující příklad kódu vytvoří vlastní vazbu, která používá MutualCertificate režim ověřování ke spuštění zabezpečené relace.

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

Pokud se ověřování systému Windows používá v kombinaci se stavovým SCT, WCF nenaplní WindowsIdentity vlastnost skutečnou identitou volajícího, ale místo toho nastaví vlastnost na anonymní. Vzhledem k tomu, že zabezpečení WCF musí znovu vytvořit obsah kontextu zabezpečení služby pro každý požadavek z příchozí SCT, server nebude sledovat relaci zabezpečení v paměti. Vzhledem k tomu, že není možné serializovat WindowsIdentity instanci do SCT, WindowsIdentity vrátí vlastnost anonymní identitu.

Toto chování vykazuje následující konfigurace.

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

Viz také