Partager via


Procédure : créer un jeton de contexte de sécurité pour une session sécurisée

En utilisant un jeton de contexte de sécurité avec état (SCT) dans une session sécurisée, la session peut résister au service qui est recyclé. Par exemple, lorsqu'un SCT sans état est utilisé dans une session sécurisée et que les services IIS (Internet Information Services) sont réinitialisés, les données de session associées au service sont perdues. Ces données de session incluent un cache du jeton SCT. Ainsi, la prochaine fois qu'un client enverra au service un SCT sans état, une erreur sera retournée, parce que la clé associée au SCT ne peut pas être récupérée. Toutefois, si un SCT avec état est utilisé, la clé associée au SCT est contenue dans le SCT. Étant donné que la clé est contenue dans le SCT et donc contenue dans le message, la session sécurisée n'est pas affectée par le service qui est recyclé. Par défaut, Windows Communication Foundation (WCF) utilise des SCT sans état dans une session sécurisée. Cette rubrique détaille la manière d’utiliser des SCT avec état dans une session sécurisée.

Notes

Les SCT avec état ne peuvent pas être utilisés dans une session sécurisée qui implique un contrat dérivé de IDuplexChannel.

Notes

Pour les applications qui utilisent des SCT avec état dans une session sécurisée, l’identité de thread pour le service doit être un compte d’utilisateur ayant un profil utilisateur associé. Lorsque le service est exécuté sous un compte qui n'a pas de profil utilisateur, tel qu'un Local Service, une exception peut être levée.

Notes

Lorsque l’emprunt d’identité est requis sur Windows XP, utilisez une session sécurisée sans SCT avec état. Lorsque des SCT avec état sont utilisés avec l’emprunt d’identité, une InvalidOperationException est levée. Pour plus d’informations, consultez Scénarios non pris en charge.

Pour utiliser des SCT avec état dans une session sécurisée

  • Créez une liaison personnalisée qui spécifie que les messages SOAP sont protégés par une session sécurisée qui utilise un SCT avec état.

    1. Définissez une liaison personnalisée en ajoutant un <customBinding> au fichier config du service.

      <customBinding>  
      </customBinding>
      
    2. Ajoutez un élément enfant <binding> à <customBinding>.

      Spécifiez un nom de liaison en affectant à l'attribut name un nom unique dans le fichier de configuration.

      <binding name="StatefulSCTSecureSession">  
      </binding>
      
    3. Spécifiez le mode d'authentification pour les messages envoyés à et depuis ce service en ajoutant un élément enfant <security> à <customBinding>.

      Spécifiez qu'une session sécurisée est utilisée en affectant à l'attribut authenticationMode la valeur SecureConversation. Spécifiez que des SCT avec état sont utilisés en affectant à l'attribut requireSecurityContextCancellation la valeur false.

      <security authenticationMode="SecureConversation"  
                requireSecurityContextCancellation="false">
      </security>
      
    4. Spécifiez le mode d’authentification du client pendant l’établissement de la session sécurisée, en ajoutant un élément enfant <secureConversationBootstrap> à <security>.

      Spécifiez comment le client est authentifié en définissant l'attribut authenticationMode.

      <secureConversationBootstrap authenticationMode="UserNameForCertificate" />  
      
    5. Spécifiez l'encodage des messages en ajoutant un élément d'encodage tel que <textMessageEncoding>.

      <textMessageEncoding />  
      
    6. Spécifiez le transport en ajoutant un élément transport, comme <httpTransport>.

      <httpTransport />  
      

    L’exemple de code suivant utilise la configuration pour spécifier une liaison personnalisée que les messages peuvent utiliser avec des SCT avec état dans une session sécurisée.

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

Exemple

L’exemple de code suivant crée une liaison personnalisée qui utilise le mode d’authentification MutualCertificate pour démarrer une session sécurisée.

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

Lorsque l’authentification Windows est utilisée en association avec un SCT avec état, WCF ne remplit pas la propriété WindowsIdentity avec l’identité de l’appelant réel mais, à la place, il définit la propriété comme anonyme. Vu que la sécurité WCF doit recréer le contenu du contexte de sécurité du service pour chaque demande du SCT entrant, le serveur ne conserve pas la session de sécurité en mémoire. Comme il est impossible de sérialiser l'instance WindowsIdentity dans le SCT, la propriété WindowsIdentity retourne une identité anonyme.

La configuration suivante expose ce comportement.

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

Voir aussi