Dela via


Anvisningar: Skapa en säkerhetskontexttoken för en säker session

Genom att använda en tillståndskänslig säkerhetskontexttoken (SCT) i en säker session kan sessionen motstå att tjänsten återvinns. När till exempel en tillståndslös SCT används i en säker session och IIS (Internet Information Services) återställs går sessionsdata som är associerade med tjänsten förlorade. Dessa sessionsdata innehåller en SCT-tokencache. Så nästa gång en klient skickar tjänsten en tillståndslös SCT returneras ett fel eftersom nyckeln som är associerad med SCT inte kan hämtas. Men om en tillståndskänslig SCT används finns nyckeln som är associerad med SCT i SCT. Eftersom nyckeln finns i SCT och därför finns i meddelandet påverkas inte den säkra sessionen av att tjänsten återanvänds. Som standard använder Windows Communication Foundation (WCF) tillståndslösa SCT i en säker session. Det här avsnittet beskriver hur du använder tillståndskänsliga SCT i en säker session.

Kommentar

Tillståndskänsliga SCT:er kan inte användas i en säker session som omfattar ett kontrakt som härleds från IDuplexChannel.

Kommentar

För program som använder tillståndskänsliga SCT i en säker session måste trådidentiteten för tjänsten vara ett användarkonto som har en associerad användarprofil. När tjänsten körs under ett konto som inte har någon användarprofil, till exempel Local Service, kan ett undantag utlöses.

Kommentar

När personifiering krävs i Windows XP använder du en säker session utan tillståndskänslig SCT. När tillståndskänsliga SCT:er används med personifiering genereras en InvalidOperationException . Mer information finns i Scenarier som inte stöds.

Så här använder du tillståndskänsliga SCT i en säker session

  • Skapa en anpassad bindning som anger att SOAP-meddelanden skyddas av en säker session som använder en tillståndskänslig SCT.

    1. Definiera en anpassad bindning genom att lägga till en <customBinding> i konfigurationsfilen för tjänsten.

      <customBinding>  
      </customBinding>
      
    2. Lägg till ett underordnat bindningselement> i <customBinding>.<

      Ange ett bindningsnamn genom att ange name attributet till ett unikt namn i konfigurationsfilen.

      <binding name="StatefulSCTSecureSession">  
      </binding>
      
    3. Ange autentiseringsläget för meddelanden som skickas till och från den här tjänsten genom att lägga till ett underordnat säkerhetselement> i <customBinding>.<

      Ange att en säker session ska användas genom att ange authenticationMode attributet till SecureConversation. Ange att tillståndskänsliga SCT:er används genom att ange requireSecurityContextCancellation attributet till false.

      <security authenticationMode="SecureConversation"  
                requireSecurityContextCancellation="false">
      </security>
      
    4. Ange hur klienten autentiseras medan den säkra sessionen upprättas genom att lägga till ett säkertConversationBootstrap-underordnat> element i< säkerheten>.<

      Ange hur klienten autentiseras genom att ange attributet authenticationMode .

      <secureConversationBootstrap authenticationMode="UserNameForCertificate" />  
      
    5. Ange meddelandekodningen genom att lägga till ett kodningselement, till exempel textMessageEncoding>.<

      <textMessageEncoding />  
      
    6. Ange transporten genom att lägga till ett transportelement, till exempel httpTransport>.<

      <httpTransport />  
      

    I följande kodexempel används konfiguration för att ange en anpassad bindning som meddelanden kan använda med tillståndskänsliga SCT i en säker session.

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

Exempel

I följande kodexempel skapas en anpassad bindning som använder autentiseringsläget MutualCertificate för att starta en säker 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()

När Windows-autentisering används i kombination med en tillståndskänslig SCT fyller WindowsIdentity WCF inte egenskapen med den faktiska anroparens identitet, utan anger i stället egenskapen till anonym. Eftersom WCF-säkerhet måste återskapa innehållet i tjänstsäkerhetskontexten för varje begäran från den inkommande SCT:n håller servern inte reda på säkerhetssessionen i minnet. Eftersom det är omöjligt att serialisera instansen WindowsIdentity till SCT WindowsIdentity returnerar egenskapen en anonym identitet.

Följande konfiguration uppvisar det här beteendet.

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

Se även