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

ms731814.note(de-de,VS.100).gifHinweis:
Zustandsbehaftete SCTs können nicht in einer sicheren Sitzung verwendet werden, die einen Vertrag einschließt, der vom IDuplexChannel abgeleitet wird.

ms731814.note(de-de,VS.100).gifHinweis:
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.

ms731814.note(de-de,VS.100).gifHinweis:
Wenn ein Identitätswechsel auf Windows XP erforderlich ist, verwenden Sie eine sichere Sitzung ohne zustandsbehaftetes SCT. Wenn ein Token für den Sicherheitszustandskontext (SCT) mit einem Identitätswechsel verwendet werden, wird eine InvalidOperationException ausgelöst. Weitere Informationen finden Sie unter Nicht unterstützte Szenarien.

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 für den Dienst der Konfigurationsdatei ein customBinding Element hinzufügen.

      <customBinding>
      
    2. Fügen Sie ein untergeordnetes <binding>customBinding Element-Element zum hinzu.

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

      <binding name="StatefulSCTSecureSession">
      
    3. Geben Sie den Authentifizierungsmodus für Nachrichten an, die an diesen und von diesem Dienst gesendet werden, indem Sie ein untergeordnetes security element of customBinding-Element zum customBinding Element 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">
      
    4. Geben Sie beim Einrichten der sicheren Sitzung an, wie der Client authentifiziert wird, indem Sie ein untergeordnetes secureConversationBootstrap element-Element zur security element of customBinding hinzufügen.

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

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

      <textMessageEncoding />
      
    6. Geben Sie den Transport an, indem Sie ein Transportelement hinzufügen, z. B. das httpTransport element.

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

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("https://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()
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("https://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();

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

Weitere Ressourcen

<custombinding>