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.
Remarque : |
---|
Les SCT avec état ne peuvent pas être utilisés dans une session sécurisée qui implique un contrat dérivé de IDuplexChannel. |
Remarque : |
---|
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. |
Remarque : |
---|
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.
Définissez une liaison personnalisée, en ajoutant un customBinding Element au fichier de configuration pour le service.
<customBinding>
Ajoutez un élément enfant <binding> à customBinding Element.
Spécifiez un nom de liaison en affectant à l'attribut name un nom unique dans le fichier de configuration.
<binding name="StatefulSCTSecureSession">
Spécifiez le mode d'authentification pour les messages envoyés à et depuis ce service en ajoutant un élément enfant security element of customBinding à customBinding Element.
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">
Spécifiez comment le client est authentifié pendant que la session sécurisée est établie en ajoutant un élément enfant secureConversationBootstrap element à security element of customBinding.
Spécifiez comment le client est authentifié en définissant l'attribut authenticationMode.
<secureConversationBootstrap authenticationMode="UserNameForCertificate" />
Spécifiez l'encodage des messages en ajoutant un élément d'encodage, tel que textMessageEncoding element.
<textMessageEncoding />
Spécifiez le transport en ajoutant un élément de transport, tel que httpTransport element.
<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.
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();
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 rend la propriété 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 n'effectue pas le suivi de 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>