Freigeben über


Vorgehensweise: Erstellen eines Tokens für den Sicherheitskontext einer sicheren Sitzung

Durch das Verwenden eines zustandsbehafteten Sicherheitskontexttokens (SCT) in einer sicheren Sitzung, kann die Sitzung verhindern, dass der Dienst wiederverwendet wird. 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. Zu den Sitzungsdaten gehört auch ein SCT-Token-Cache. Wenn ein Client also das nächste Mal dem Dienst einen zustandsbehafteten SCT sendet, wird ein Fehler zurückgegeben, da der diesem SCT zugewiesene Schlüssel nicht abgerufen werden kann. Wenn jedoch ein zustandsbehafteter SCT verwendet wird, enthält das SCT den diesem SCT zugewiesenen Schlüssel. 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. Standardmäßig verwendet Windows Communication Foundation (WCF) zustandslose SCTs in einer sicheren Sitzung. Dieses Thema erläutert, wie Sie zustandsbehaftete SCTs in einer sicheren Sitzung verwenden können.

Hinweis

Zustandsbehaftete SCTs können nicht in einer sicheren Sitzung verwendet werden, die einen Vertrag einschließt, der vom IDuplexChannel abgeleitet wird.

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. 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.

Hinweis

Wenn ein Identitätswechsel auf Windows XP erforderlich ist, verwenden Sie eine sichere Sitzung ohne zustandsbehaftetes SCT. Wenn zustandsbehaftete Token für den Sicherheitskontext (SCTs) mit einem Identitätswechsel verwendet werden, wird ein InvalidOperationException ausgelöst. Weitere Informationen finden Sie unter Nicht unterstützte Szenarios.

So verwenden Sie zustandsbehaftete SCTs in einer sicheren Sitzung

  • Erstellen Sie eine benutzerdefinierte Bindung, die angibt, dass SOAP-Nachrichten durch eine sichere Sitzung mit einem zustandsbehafteten SCT geschützt sind.

    1. Definieren Sie eine benutzerdefinierte Bindung, indem Sie der Konfigurationsdatei für den Dienst eine <customBinding-> hinzufügen.

      <customBinding>  
      </customBinding>
      
    2. Fügen Sie ein untergeordnetes <Bindungselement> zur <customBinding> hinzu.

      Geben Sie einen Bindungsnamen an, indem Sie das name-Attribut auf einen eindeutigen Namen in der Konfigurationsdatei festlegen.

      <binding name="StatefulSCTSecureSession">  
      </binding>
      
    3. Legen Sie den Authentifizierungsmodus für Nachrichten fest, die an und von diesem Dienst gesendet werden, indem Sie ein untergeordnetes <Sicherheitselement> zu der <customBinding> hinzufügen.

      Legen Sie fest, dass eine sichere Sitzung verwendet wird, indem Sie das authenticationMode-Attribut auf SecureConversation setzen. Legen Sie fest, dass zustandsbehaftete SCTs verwendet werden, indem Sie das requireSecurityContextCancellation-Attribut auf false setzen.

      <security authenticationMode="SecureConversation"  
                requireSecurityContextCancellation="false">
      </security>
      
    4. Geben Sie an, wie der Client während des Aufbaus der sicheren Sitzung authentifiziert wird, indem Sie ein untergeordnetes <secureConversationBootstrap>-Element zur <security> hinzufügen.

      Geben Sie an, wie der Client authentifiziert wird, indem Sie das authenticationMode-Attribut setzen.

      <secureConversationBootstrap authenticationMode="UserNameForCertificate" />  
      
    5. Geben Sie die Nachrichtencodierung an, indem Sie ein Codierungselement hinzufügen, z. B. <textMessageEncoding>.

      <textMessageEncoding />  
      
    6. Geben Sie den Transport an, indem Sie ein Transportelement hinzufügen, z. B. das <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.

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

Beispiel

Das folgende Codebeispiel erstellt eine benutzerdefinierte Bindung, die den MutualCertificate-Authentifizierungsmodus verwendet, um eine sichere Sitzung mithilfe eines Bootstrap-Vorgangs zu starten.

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 WCF nicht die WindowsIdentity-Eigenschaft mit der tatsächlichen Identität des Anrufers aus, sondern legt die Eigenschaft auf den Wert Anonym fest. Da die WCF-Sicherheit den Inhalt des Dienstsicherheitskontextes für jede Anfrage vom eingehenden SCT neu erstellen muss, verfolgt der Server nicht die Sicherheitssitzung im Speicher. Da die WindowsIdentity-Instanz nicht in das SCT serialisiert werden kann, gibt die WindowsIdentity-Eigenschaft eine anonyme Identität zurück.

Die folgende Konfiguration weist dieses Verhalten auf.

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

Siehe auch