Procedure: Een beveiligingscontexttoken maken voor een beveiligde sessie
Door gebruik te maken van een stateful security context token (SCT) in een beveiligde sessie, kan de sessie bestand zijn tegen de service die wordt gerecycled. Wanneer een staatloze SCT bijvoorbeeld wordt gebruikt in een beveiligde sessie en IIS (Internet Information Services) opnieuw wordt ingesteld, gaan de sessiegegevens die aan de service zijn gekoppeld, verloren. Deze sessiegegevens bevatten een SCT-tokencache. De volgende keer dat een client de service een stateless SCT verzendt, wordt er een fout geretourneerd, omdat de sleutel die is gekoppeld aan de SCT niet kan worden opgehaald. Als er echter een stateful SCT wordt gebruikt, wordt de sleutel die aan de SCT is gekoppeld, opgenomen in de SCT. Omdat de sleutel zich in de SCT bevindt en dus in het bericht is opgenomen, wordt de beveiligde sessie niet beïnvloed door de service die wordt gerecycled. Windows Communication Foundation (WCF) maakt standaard gebruik van stateless SCT's in een beveiligde sessie. In dit onderwerp wordt beschreven hoe u stateful SCT's gebruikt in een beveiligde sessie.
Notitie
Stateful SCT's kunnen niet worden gebruikt in een beveiligde sessie waarbij een contract is betrokken dat is afgeleid van IDuplexChannel.
Notitie
Voor toepassingen die stateful SCT's in een beveiligde sessie gebruiken, moet de thread-identiteit voor de service een gebruikersaccount met een gekoppeld gebruikersprofiel zijn. Wanneer de service wordt uitgevoerd onder een account dat geen gebruikersprofiel heeft, zoals Local Service
, kan er een uitzondering worden gegenereerd.
Notitie
Wanneer imitatie is vereist in Windows XP, gebruikt u een beveiligde sessie zonder stateful SCT. Wanneer stateful SCT's worden gebruikt met imitatie, wordt er een InvalidOperationException gegenereerd. Zie Niet-ondersteunde scenario's voor meer informatie.
Stateful SCT's gebruiken in een beveiligde sessie
Maak een aangepaste binding die aangeeft dat SOAP-berichten worden beveiligd door een beveiligde sessie die gebruikmaakt van een stateful SCT.
Definieer een aangepaste binding door een <customBinding> toe te voegen aan het configuratiebestand voor de service.
<customBinding> </customBinding>
Voeg een onderliggend bindingselement> toe aan customBinding><.<
Geef een bindingsnaam op door het
name
kenmerk in te stellen op een unieke naam in het configuratiebestand.<binding name="StatefulSCTSecureSession"> </binding>
Geef de verificatiemodus op voor berichten die naar en van deze service worden verzonden door een <onderliggend beveiligingselement> toe te voegen aan customBinding<>.
Geef op dat een beveiligde sessie wordt gebruikt door het
authenticationMode
kenmerk in te stellen opSecureConversation
. Geef op dat stateful SCT's worden gebruikt door hetrequireSecurityContextCancellation
kenmerk in te stellen opfalse
.<security authenticationMode="SecureConversation" requireSecurityContextCancellation="false"> </security>
Geef op hoe de client wordt geverifieerd terwijl de beveiligde sessie tot stand is gebracht door een onderliggend element secureConversationBootstrap> toe te voegen aan de< beveiliging>.<
Geef op hoe de client wordt geverifieerd door het
authenticationMode
kenmerk in te stellen.<secureConversationBootstrap authenticationMode="UserNameForCertificate" />
Geef de berichtcodering op door een coderingselement toe te voegen, zoals textMessageEncoding>.<
<textMessageEncoding />
Geef het transport op door een transportelement toe te voegen, zoals httpTransport><.
<httpTransport />
In het volgende codevoorbeeld wordt een configuratie gebruikt om een aangepaste binding op te geven die berichten kunnen gebruiken met stateful SCT's in een beveiligde sessie.
<customBinding> <binding name="StatefulSCTSecureSession"> <security authenticationMode="SecureConversation" requireSecurityContextCancellation="false"> <secureConversationBootstrap authenticationMode="UserNameForCertificate" /> </security> <textMessageEncoding /> <httpTransport /> </binding> </customBinding>
Opmerking
In het volgende codevoorbeeld wordt een aangepaste binding gemaakt die gebruikmaakt van de MutualCertificate verificatiemodus om een beveiligde sessie te bootstrapen.
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()
Wanneer Windows-verificatie wordt gebruikt in combinatie met een stateful SCT, vult WCF de WindowsIdentity eigenschap niet met de identiteit van de werkelijke beller, maar stelt de eigenschap in op anoniem. Omdat WCF-beveiliging de inhoud van de servicebeveiligingscontext opnieuw moet maken voor elke aanvraag van de binnenkomende SCT, houdt de server de beveiligingssessie in het geheugen niet bij. Omdat het onmogelijk is om het exemplaar in de WindowsIdentity SCT te serialiseren, retourneert de WindowsIdentity eigenschap een anonieme identiteit.
De volgende configuratie vertoont dit gedrag.
<customBinding>
<binding name="Cancellation">
<textMessageEncoding />
<security
requireSecurityContextCancellation="false">
<secureConversationBootstrap />
</security>
<httpTransport />
</binding>
</customBinding>