Procédure : verrouiller des points de terminaison dans l’entreprise
Les entreprises de grande taille exigent souvent que les applications soient développées conformément à leurs stratégies de sécurité. La rubrique suivante explique comment développer et installer un validateur de point de terminaison client permettant de valider l’ensemble des applications clientes Windows Communication Foundation (WCF) installées sur les ordinateurs.
Dans ce cas, il s’agit d’un validateur client, car ce comportement de point de terminaison est ajouté à la section <commonBehaviors> du client dans le fichier machine.config. WCF charge uniquement les comportements de point de terminaison communs pour les applications clientes et uniquement les comportements de service communs pour les applications de service. Pour installer ce même validateur pour les applications de service, le validateur doit être un comportement de service. Pour plus d’informations, consultez la section <commonBehaviors>.
Important
Les comportements de service ou de point de terminaison non marqués avec l’attribut AllowPartiallyTrustedCallersAttribute (APTCA) qui sont ajoutés à la section <commonBehaviors> d’un fichier de configuration ne sont pas exécutés lorsque l’application s’exécute dans un environnement de confiance partielle, et aucune exception n’est levée lorsque cela se produit. Pour appliquer l'exécution des comportements courants tels que les validateurs, vous devez effectuer l'une des actions suivantes :
Marquez votre comportement courant avec l’attribut AllowPartiallyTrustedCallersAttribute afin qu’il soit exécuté lorsqu’il est déployé comme une application de confiance partielle. Notez qu'une entrée de Registre peut être définie sur l'ordinateur pour interdire l'exécution des assemblys marqués avec l'attribut APTCA.
Si l’application est déployée comme une application de confiance partielle, vérifiez que les utilisateurs ne peuvent pas modifier les paramètres de sécurité d'accès du code pour exécuter l'application dans un environnement de confiance partielle. S'ils peuvent le faire, le validateur personnalisé ne s'exécute pas et aucune exception n'est levée. Pour savoir comment garantir cette configuration, consultez l’option
levelfinal
à l’aide de l’outil Stratégie de sécurité d'accès du code (Caspol.exe).
Pour plus d'informations, consultez Meilleures pratiques dans un environnement de confiance partielle et Scénarios de déploiement pris en charge.
Pour créer le validateur de point de terminaison
Créez un objet IEndpointBehavior avec les étapes de validation souhaitées dans la méthode Validate. Le code suivant montre un exemple. (
InternetClientValidatorBehavior
est extrait de l’exemple Security Validation.)public class InternetClientValidatorBehavior : IEndpointBehavior { public void AddBindingParameters(ServiceEndpoint serviceEndpoint, System.ServiceModel.Channels.BindingParameterCollection bindingParameters) { } public void ApplyClientBehavior(ServiceEndpoint serviceEndpoint, System.ServiceModel.Dispatcher.ClientRuntime behavior) { } public void ApplyDispatchBehavior(ServiceEndpoint serviceEndpoint, System.ServiceModel.Dispatcher.EndpointDispatcher endpointDispatcher) { } public void Validate(ServiceEndpoint endpoint) { BindingElementCollection elements = endpoint.Binding.CreateBindingElements(); if (EndpointIsDual(endpoint, elements)) throw new InvalidOperationException("InternetClientValidator: endpoint uses 'dual' mode. This mode is disallowed for use with untrusted services."); if (EndpointAllowsNtlm(endpoint, elements)) throw new InvalidOperationException("InternetClientValidator: endpoint allows NTLM. This mode is disallowed for use with untrusted services."); if (EndpointAllowsTransactionFlow(endpoint, elements)) throw new InvalidOperationException("InternetClientValidator: endpoint flows transaction ids. This mode is disallowed for use with untrusted services."); }
Créez un objet BehaviorExtensionElement qui enregistre le validateur de point de terminaison créé à l'étape 1. L'exemple de code suivant illustre ce point. (Le code d’origine pour cet exemple se trouve dans l’exemple Security Validation.)
public class InternetClientValidatorElement : BehaviorExtensionElement { public override Type BehaviorType { get { return typeof(InternetClientValidatorBehavior); } } protected override object CreateBehavior() { return new InternetClientValidatorBehavior(); } }
Assurez-vous que l'assembly compilé est signé avec un nom fort. Pour plus d'informations, consultez Outil Strong Name Tool (SN.EXE) et les commandes du compilateur pour votre langage.
Pour installer le validateur dans l'ordinateur cible
Installez le validateur de point de terminaison à l'aide du mécanisme approprié. Dans une entreprise, cela peut s'effectuer en utilisant la stratégie de groupe ou SMS (Systems Management Server).
Installez l’assembly avec nom fort dans le Global Assembly Cache à l’aide de l’outil Global Assembly Cache (Gacutil.exe).
Utilisez les types d'espaces de noms System.Configuration pour :
Ajoutez l’extension à la section <behaviorExtensions> à l’aide d’un nom de type complet et verrouillez l’élément.
// Register our validator configuration element. ExtensionsSection extensions = machine.GetSection(@"system.serviceModel/extensions") as ExtensionsSection; if (extensions == null) throw new Exception("not extensions section."); ExtensionElement validator = new ExtensionElement( "internetClientValidator", "Microsoft.ServiceModel.Samples.InternetClientValidatorElement, InternetClientValidator, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null" ); validator.LockItem = true; if (extensions.BehaviorExtensions.IndexOf(validator) < 0) extensions.BehaviorExtensions.Add(validator);
Ajoutez l’élément de comportement à la propriété
EndpointBehaviors
de la section <commonBehaviors> et verrouillez l’élément. (Pour installer le validateur sur le service, le validateur doit être un IServiceBehavior et ajouté à laServiceBehaviors
propriété.) L’exemple de code suivant montre la configuration appropriée après les étapes a. et b., à la seule exception qu’il n’existe aucun nom fort.// Add a new section for our validator and lock it down. // Behaviors for client applications must be endpoint behaviors. // Behaviors for service applications must be service behaviors. CommonBehaviorsSection commonBehaviors = machine.GetSection(@"system.serviceModel/commonBehaviors") as CommonBehaviorsSection; InternetClientValidatorElement internetValidator = new InternetClientValidatorElement(); internetValidator.LockItem = true; commonBehaviors.EndpointBehaviors.Add(internetValidator);
Enregistrez le fichier machine.config. L'exemple de code suivant exécute l'ensemble des tâches dans l'étape 3, mais enregistre une copie du fichier machine.config modifié localement.
// Write to disk. machine.SaveAs("newMachine.config"); // Write our new information. SectionInformation cBInfo = commonBehaviors.SectionInformation; Console.WriteLine(cBInfo.GetRawXml()); Console.WriteLine(extensions.SectionInformation.GetRawXml()); Console.Read();
Exemple
L'exemple de code suivant indique comment ajouter un comportement commun au fichier machine.config et enregistrer une copie sur le disque. InternetClientValidatorBehavior
est extrait de l’exemple Security Validation.
Configuration machine = ConfigurationManager.OpenMachineConfiguration();
// Register our validator configuration element.
ExtensionsSection extensions
= machine.GetSection(@"system.serviceModel/extensions") as ExtensionsSection;
if (extensions == null)
throw new Exception("not extensions section.");
ExtensionElement validator
= new ExtensionElement(
"internetClientValidator",
"Microsoft.ServiceModel.Samples.InternetClientValidatorElement, InternetClientValidator, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null"
);
validator.LockItem = true;
if (extensions.BehaviorExtensions.IndexOf(validator) < 0)
extensions.BehaviorExtensions.Add(validator);
// Add a new section for our validator and lock it down.
// Behaviors for client applications must be endpoint behaviors.
// Behaviors for service applications must be service behaviors.
CommonBehaviorsSection commonBehaviors
= machine.GetSection(@"system.serviceModel/commonBehaviors") as CommonBehaviorsSection;
InternetClientValidatorElement internetValidator = new InternetClientValidatorElement();
internetValidator.LockItem = true;
commonBehaviors.EndpointBehaviors.Add(internetValidator);
// Write to disk.
machine.SaveAs("newMachine.config");
// Write our new information.
SectionInformation cBInfo = commonBehaviors.SectionInformation;
Console.WriteLine(cBInfo.GetRawXml());
Console.WriteLine(extensions.SectionInformation.GetRawXml());
Console.Read();
Sécurité du .NET Framework
Vous pouvez également chiffrer les éléments du fichier de configuration. Pour plus d'informations, consultez la section Voir aussi.