Vorgehensweise: Erstellen eines Tokens für den Sicherheitskontext einer sicheren SitzungHow to: Create a Security Context Token for a Secure Session

Durch das Verwenden eines zustandsbehafteten Sicherheitskontexttokens (SCT) in einer sicheren Sitzung, kann die Sitzung verhindern, dass der Dienst wiederverwendet wird.By using a stateful security context token (SCT) in a secure session, the session can withstand the service being recycled. Wenn beispielsweise ein zustandsloses SCT in einer sicheren Sitzung verwendet wird und die IIS (Internet Information Services) zurückgesetzt werden, gehen die Sitzungsdaten, die dem Dienst zugewiesen sind, verloren.For instance, when a stateless SCT is used in a secure session and Internet Information Services (IIS) is reset, then the session data that is associated with the service is lost. Zu den Sitzungsdaten gehört auch ein SCT-Token-Cache.This session data includes an SCT token cache. Wenn ein Client also das nächste Mal dem Dienst einen zustandsloses SCT sendet, wird ein Fehler zurückgegeben, da der diesem SCT zugewiesene Schlüssel nicht abgerufen werden kann.So, the next time a client sends the service a stateless SCT, an error is returned, because the key that is associated with the SCT cannot be retrieved. Wenn jedoch ein zustandsbehafteter SCT verwendet wird, enthält das SCT den diesem SCT zugewiesenen Schlüssel.If, however, a stateful SCT is used, then the key that is associated with the SCT is contained within the SCT. Da der Schlüssel im SCT enthalten ist und somit auch in der Nachricht, wird die sichere Sitzung nicht von der Wiederverwendung des Dienstes beeinträchtigt.Because the key is contained within the SCT and thus contained within the message, the secure session is not affected by the service being recycled. Standardmäßig verwendet Windows Communication Foundation (WCF)Windows Communication Foundation (WCF) zustandslose SCTs in einer sicheren Sitzung.By default, Windows Communication Foundation (WCF)Windows Communication Foundation (WCF) uses stateless SCTs in a secure session. Dieses Thema erläutert, wie Sie zustandsbehaftete SCTs in einer sicheren Sitzung verwenden können.This topic details how to use stateful SCTs in a secure session.

Hinweis

Zustandsbehaftete SCTs können nicht in einer sicheren Sitzung verwendet werden, die einen Vertrag einschließt, der vom IDuplexChannel abgeleitet wird.Stateful SCTs cannot be used in a secure session that involves a contract that derives from IDuplexChannel.

Hinweis

Bei Anwendungen, die zustandsbehaftete SCTs in einer sicheren Sitzung verwenden, muss die Thread-Identität des Dienstes ein Benutzerkonto sein, dem ein Benutzerprofil zugewiesen ist.For applications that use stateful SCTs in a secure session, the thread identity for the service must be a user account that has an associated user profile. Wenn der Dienst unter einem Konto ausgeführt wird, für das kein Benutzerprofil festgelegt wurde, z. B. ein Local Service, wird möglicherweise eine Ausnahme ausgegeben.When the service is run under an account that does not have a user profile, such as Local Service, an exception may be thrown.

Hinweis

Wenn ein Identitätswechsel auf Windows XP erforderlich ist, verwenden Sie eine sichere Sitzung ohne zustandsbehaftetes SCT.When impersonation is required on Windows XP, use a secure session without a stateful SCT. Wenn Token für den Sicherheitszustandskontext (SCTs) mit einem Identitätswechsel verwendet werden, wird ein InvalidOperationException ausgelöst.When stateful SCTs are used with impersonation, an InvalidOperationException is thrown. Weitere Informationen finden Sie unterFor more information, seeNicht unterstützte Szenarien. Unsupported Scenarios.

So verwenden Sie zustandsbehaftete SCTs in einer sicheren SitzungTo use stateful SCTs in a secure session

  • Erstellen Sie eine benutzerdefinierte Bindung, die angibt, dass SOAP-Nachrichten durch eine sichere Sitzung mit einem zustandsbehafteten SCT geschützt sind.Create a custom binding that specifies that SOAP messages are protected by a secure session that uses a stateful SCT.

    1. Definieren Sie eine benutzerdefinierte Bindung durch Hinzufügen einer <CustomBinding > in die Konfigurationsdatei für den Dienst.Define a custom binding, by adding a <customBinding> to the configuration file for the service.

      <customBinding>  
      
    2. Hinzufügen einer <Bindung > untergeordnetes Element der <CustomBinding >.Add a <binding> child element to the <customBinding>.

      Geben Sie einen Bindungsnamen an, indem Sie das name-Attribut auf einen eindeutigen Namen in der Konfigurationsdatei festlegen.Specify a binding name by setting the name attribute to a unique name within the configuration file.

      <binding name="StatefulSCTSecureSession">  
      
    3. Geben Sie den Authentifizierungsmodus für Nachrichten an und von diesem Dienst durch Hinzufügen einer <Sicherheit > untergeordnetes Element der <CustomBinding >.Specify the authentication mode for messages sent to and from this service by adding a <security> child element to the <customBinding>.

      Legen Sie fest, dass eine sichere Sitzung verwendet wird, indem Sie das authenticationMode-Attribut auf SecureConversation setzen.Specify that a secure session is used by setting the authenticationMode attribute to SecureConversation. Legen Sie fest, dass zustandsbehaftete SCTs verwendet werden, indem Sie das requireSecurityContextCancellation-Attribut auf false setzen.Specify that stateful SCTs are used by setting the requireSecurityContextCancellation attribute to false.

      <security authenticationMode="SecureConversation"  
                requireSecurityContextCancellation="false">  
      
    4. Angeben, wie der Client authentifiziert wird, während die sichere Sitzung, durch Hinzufügen verwendet wird einer <SecureConversationBootstrap > untergeordnetes Element der <Sicherheit >.Specify how the client is authenticated while the secure session is established by adding a <secureConversationBootstrap> child element to the <security>.

      Geben Sie an, wie der Client authentifiziert wird, indem Sie das authenticationMode-Attribut setzen.Specify how the client is authenticated by setting the authenticationMode attribute.

      <secureConversationBootstrap authenticationMode="UserNameForCertificate" />  
      
    5. Geben Sie die nachrichtencodierung, indem Sie ein Codierungselement, z. B. hinzufügen <TextMessageEncoding >.Specify the message encoding by adding an encoding element, such as <textMessageEncoding>.

      <textMessageEncoding />  
      
    6. Geben Sie den Transport durch Hinzufügen von ein Transportelement, z. B. die <HttpTransport >.Specify the transport by adding a transport element, such as the <httpTransport>.

      <httpTransport />  
      

    Im folgenden Codebeispiel wird die Konfiguration verwendet, um eine benutzerdefinierte Bindung anzugeben, die Nachrichten mit zustandsbehafteten SCTs in einer sicheren Sitzung verwenden können.The following code example uses configuration to specify a custom binding that messages can use with stateful SCTs in a secure session.

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

BeispielExample

Das folgende Codebeispiel erstellt eine benutzerdefinierte Bindung, die den MutualCertificate-Authentifizierungsmodus verwendet, um eine sichere Sitzung mithilfe eines Bootstrap-Vorgangs zu starten.The following code example creates a custom binding that uses the MutualCertificate authentication mode to bootstrap a secure session.

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

Wenn die Windows-Authentifizierung zusammen mit einem zustandsbehafteten SCT verwendet wird, füllt WCFWCF nicht die WindowsIdentity-Eigenschaft mit der tatsächlichen Identität des Anrufers aus, sondern legt die Eigenschaft auf den Wert Anonym fest.When Windows authentication is used in combination with a stateful SCT, WCFWCF does not populate the WindowsIdentity property with the actual caller's identity but instead sets the property to anonymous. Da die WCFWCF-Sicherheit den Inhalt des Dienstsicherheitskontextes für jede Anfrage vom eingehenden SCT neu erstellen muss, verfolgt der Server nicht die Sicherheitssitzung im Speicher.Because WCFWCF security must re-create the content of the service security context for every request from the incoming SCT, the server does not keep track of the security session in the memory. Da die WindowsIdentity-Instanz nicht in das SCT serialisiert werden kann, gibt die WindowsIdentity-Eigenschaft eine anonyme Identität zurück.Because it is impossible to serialize the WindowsIdentity instance into the SCT, the WindowsIdentity property returns an anonymous identity.

Die folgende Konfiguration weist dieses Verhalten auf.The following configuration exhibits this behavior.

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

Siehe auchSee Also

<CustomBinding ><customBinding>