Fonctionnement des niveaux de protectionUnderstanding Protection Level

La propriété ProtectionLevel est partagée par de nombreuses classes différentes, par exemple par les classes ServiceContractAttribute et OperationContractAttribute.The ProtectionLevel property is found on many different classes, such as the ServiceContractAttribute and the OperationContractAttribute classes. Cette propriété contrôle tout ou partie des modalités de protection d'un message.The property controls how a part (or whole) of a message is protected. Cette rubrique explique la fonctionnalité de Windows Communication Foundation (WCF) et son fonctionnement.This topic explains the Windows Communication Foundation (WCF) feature and how it works.

Pour obtenir des instructions sur la définition du niveau de protection, consultez Comment : Définissez la propriété ProtectionLevel.For instructions on setting the protection level, see How to: Set the ProtectionLevel Property.

Notes

Les niveaux de protection peuvent uniquement être définis dans le code et non dans la configuration.Protection levels can be set only in code, not in configuration.

Principes de baseBasics

Le fonctionnement des niveaux de protection ne peut être correctement appréhendé sans comprendre au préalable les principes de base les régissant :To understand the protection level feature, the following basic statements apply:

  • Il existe trois niveaux de base de protection pour les différentes parties d'un message.Three basic levels of protection exist for any part of a message. La propriété (où qu'elle intervienne) a la valeur de l'une des valeurs d'énumération ProtectionLevel.The property (wherever it occurs) is set to one of the ProtectionLevel enumeration values. Ces valeurs sont (par niveau de protection croissant) :In ascending order of protection, they include:

    • None.None.

    • Sign.Sign. La partie protégée est signée numériquement.The protected part is digitally signed. Cette signature numérique garantit la détection de toute tentative de falsification de la partie protégée d'un message.This ensures detection of any tampering with the protected message part.

    • EncryptAndSign.EncryptAndSign. La partie du message est chiffrée pour garantir sa confidentialité avant signature.The message part is encrypted to ensure confidentiality before it is signed.

  • Vous pouvez définir les exigences de protection uniquement pour données d’application avec cette fonctionnalité.You can set protection requirements only for application data with this feature. Par exemple, les en-têtes WS-Addressing correspondent à des données d'infrastructure, elles ne sont, par conséquent, pas affectées par la propriété ProtectionLevel.For example, WS-Addressing headers are infrastructure data and, therefore, are not affected by the ProtectionLevel.

  • Lorsque le mode de sécurité a la valeur Transport, le message est protégé dans sa totalité par les mécanismes de transport.When the security mode is set to Transport, the entire message is protected by the transport mechanism. Par conséquent, la définition de niveaux de protection distincts pour ses différentes parties est sans effet.Therefore, setting a separate protection level for different parts of a message has no effect.

  • Le ProtectionLevel permet aux développeurs de définir le niveau minimum auxquels une liaison doit se conformer.The ProtectionLevel is a way for the developer to set the minimum level that a binding must comply with. Lors du déploiement d'un service, la liaison réelle spécifiée dans la configuration peut ou non prendre en charge ce niveau minimum.When a service is deployed, the actual binding specified in configuration may or may not support the minimum level. Par exemple, la classe BasicHttpBinding n'offre, par défaut, aucune sécurité (bien que le système de sécurité puisse être activé).For example, by default, the BasicHttpBinding class does not supply security (although it can be enabled). Par conséquent, l'utilisation d'un contrat ayant une valeur autre que None provoquera la levée d'une exception.Therefore, using it with a contract that has any setting other than None will cause an exception to be thrown.

  • Si le service exige que la valeur minimale ProtectionLevel pour tous les messages est Sign, un client (par exemple créé par une technologie non-WCF) peut chiffrer et signer tous les messages (ce qui est supérieur à la condition minimale requise).If the service requires that the minimum ProtectionLevel for all messages is Sign, a client (perhaps created by a non-WCF technology) can encrypt and sign all messages (which is more than the minimum required). Dans ce cas, WCF lève pas une exception, car le client a effectué plus de la valeur minimale.In this case, WCF will not throw an exception because the client has done more than the minimum. Notez, cependant, que les applications WCF (clients ou services) ne seront pas excessif sécurisé une partie de message si possible mais doit respecter le niveau minimal.Note, however, that WCF applications (services or clients) will not over-secure a message part if possible but will comply with the minimum level. Notez également que lorsque le paramètre Transport est utilisé comme mode de sécurité, celui-ci risque de sur-sécuriser le flux des messages, car, de part sa nature il n'est pas en mesure de les sécuriser à un niveau plus granulaire.Also note that when using Transport as the security mode, the transport may over-secure the message stream because it is inherently unable to secure at a more granular level.

  • Si vous affectez explicitement ProtectionLevel ou Sign à la propriété EncryptAndSign, vous devrez alors utiliser une liaison dont la sécurité est activée, faute de quoi une exception sera levée.If you set the ProtectionLevel explicitly to either Sign or EncryptAndSign, then you must use a binding with security enabled or an exception will be thrown.

  • Si vous sélectionnez une liaison qui active la sécurité et que vous ne définissez pas la propriété ProtectionLevel à quelque endroit du contrat, toutes les données d’application seront chiffrées et signées.If you select a binding that enables security and you do not set the ProtectionLevel property anywhere on the contract, all application data will be encrypted and signed.

  • Si vous sélectionnez une liaison dont la sécurité n'est pas activée (par exemple, la sécurité de la classe BasicHttpBinding est désactivée par défaut) et que la propriété ProtectionLevel n'est pas définie explicitement, alors aucune des données d'application ne sera protégée.If you select a binding that does not have security enabled (for example, the BasicHttpBinding class has security disabled by default), and the ProtectionLevel is not explicitly set, then none of the application data will be protected.

  • Si vous utilisez une liaison qui applique la sécurité au niveau du transport, toutes les données d’application seront sécurisées en fonction des paramètres de sécurité du transport.If you are using a binding that applies security at the transport level, all application data will be secured according to the capabilities of the transport.

  • Si vous utilisez une liaison qui applique la sécurité au niveau du message, les données d’application seront sécurisées en fonction des niveaux de protection définis sur le contrat.If you use a binding that applies security at the message level, then application data will be secured according to the protection levels set on the contract. Si vous ne spécifiez aucun niveau de protection, toutes les données d'application figurant dans les messages seront chiffrées et signées.If you do not specify a protection level, then all application data in the messages will be encrypted and signed.

  • Des niveaux de portée différents peuvent être affectés à la propriété ProtectionLevel.The ProtectionLevel can be set at different scoping levels. Il existe en effet une hiérarchie dans les niveaux de portée. Cette hiérarchie est abordée en détail dans la section suivante.There is a hierarchy associated with scoping, which is explained in the next section.

PortéeScoping

La définition de la propriété ProtectionLevel à partir de l'API la plus élevée détermine le niveau de protection pour toutes les interfaces API figurant en dessous.Setting the ProtectionLevel on the topmost API sets the level for all levels below it. Si une valeur différente est affectée à la propriété ProtectionLevel à un niveau inférieur, toutes les API figurant en dessous de ce niveau sont initialisées sur cette nouvelle valeur. En revanche, toutes les API se trouvant au-dessus conservent la valeur affectée à l'API la plus élevée dans la hiérarchie.If the ProtectionLevel is set to a different value at a lower level, all APIs below that level in the hierarchy will now be reset to the new level (APIs above it, however, will still be affected by the topmost level). Cette hiérarchie se présente comme suit :The hierarchy is as follows. Les attributs au même niveau sont des homologues.Attributes at the same level are peers.

Programmation de la propriété ProtectionLevelProgramming ProtectionLevel

Pour programmer ProtectionLevel à un quelconque niveau de la hiérarchie, il vous suffit d'affecter à la propriété une valeur adéquate lors de l'application de l'attribut.To program the ProtectionLevel at any point in the hierarchy, simply set the property to an appropriate value when applying the attribute. Pour obtenir des exemples, consultez Guide pratique pour Définissez la propriété ProtectionLevel.For examples, see How to: Set the ProtectionLevel Property.

Notes

La définition de la propriété sur les erreurs et les contrats de message nécessite de comprendre au préalable le fonctionnement de ces fonctionnalités.Setting the property on faults and message contracts requires understanding how those features work. Pour plus d'informations, voir Procédure : Définissez la propriété ProtectionLevel et à l’aide de contrats de Message.For more information, see How to: Set the ProtectionLevel Property and Using Message Contracts.

Dépendance WS-AddressingWS-Addressing Dependency

Dans la plupart des cas, à l’aide de la ServiceModel Metadata Utility Tool (Svcutil.exe) pour générer un client permet de s’assurer que les contrats de service et client sont identiques.In most cases, using the ServiceModel Metadata Utility Tool (Svcutil.exe) to generate a client ensures that the client and service contracts are identical. Toutefois, des contrats apparemment identiques peuvent provoquer la levée d'une exception de la part du client.However, seemingly identical contracts can cause the client to throw an exception. Cela se produit lorsqu'une liaison ne prend pas en charge la spécification WS-Addressing et que plusieurs niveaux de protection sont spécifiés sur le contrat.This occurs whenever a binding does not support the WS-Addressing specification and multiple levels of protection are specified on the contract. Par exemple, la classe BasicHttpBinding ne prend pas en charge cette spécification ni la création de liaisons personnalisées non compatibles avec WS-Addressing.For example, the BasicHttpBinding class does not support the specification, or if you create a custom binding that does not support WS-Addressing. La fonctionnalité ProtectionLevel utilise la spécification WS-Addressing pour activer des niveaux de protection différents sur un contrat unique.The ProtectionLevel feature relies on the WS-Addressing specification to enable different protection levels on a single contract. Si la liaison ne prend pas en charge la spécification WS-Addressing, le même niveau de protection sera affecté à tous les niveaux.If the binding does not support the WS-Addressing specification, all levels will be set to the same protection level. Le niveau de protection le plus élevé du contrat sera celui de toutes les portées figurant sur ce dernier.The effective protection level for all scopes on the contract will be set to the strongest protection level used on the contract.

Un problème, à première vue difficile à résoudre, peut en découler.This may cause a problem that is hard to debug at first glance. Il est possible de créer un contrat client (une interface) contenant des méthodes destinées à plusieurs services.It is possible to create a client contract (an interface) that includes methods for more than one service. Cela signifie que la même interface sera utilisée pour créer le client qui communiquera avec un grand nombre de services et que cette même et seule interface contiendra l'ensemble des méthodes destinées à l'ensemble des services.That is, the same interface is used to create a client that communicates with many services, and the single interface contains methods for all services. Dans cette situation peu courante, les développeurs doivent faire attention à utiliser uniquement des méthodes compatibles avec les différents services.The developer must take care in this rare scenario to invoke only those methods that are applicable for each particular service. Si la liaison correspond à la classe BasicHttpBinding, la prise en charge de plusieurs niveaux de protection ne sera pas possible.If the binding is the BasicHttpBinding class, multiple protection levels cannot be supported. Toutefois, lorsqu'un service répond à un client, il peut le faire en respectant un niveau de protection inférieur à celui requis.However, a service replying to the client might respond to a client with a lower protection level than required. Dans ce cas, le client lèvera une exception, celui-ci s'attendant en effet à un niveau de protection plus élevé.In this case, the client will throw an exception because it expects a higher protection level.

Un exemple du code illustre ce problème.An example of the code illustrates this problem. Un exemple de contrat de service et de client est donné ci-dessous.The following example shows a service and a client contract. Supposons que la liaison est le <basicHttpBinding > élément.Assume that the binding is the <basicHttpBinding> element. Toutes les opérations figurant sur un contrat disposent alors du même niveau de protection.Therefore, all operations on a contract have the same protection level. Ce niveau de protection uniforme est défini comme étant le niveau de protection maximal appliqué à l'ensemble des opérations.This uniform protection level is determined as the maximum protection level across all operations.

Le contrat de service est :The service contract is:

[ServiceContract()]
public interface IPurchaseOrder
{
    [OperationContract(ProtectionLevel = ProtectionLevel.Sign)]
    int Price();
}
<ServiceContract()> _
Public Interface IPurchaseOrder
    <OperationContract(ProtectionLevel := ProtectionLevel.Sign)> _
    Function Price() As Integer
End Interface

Le code suivant donne un exemple d'interface de contrat client.The following code shows the client contract interface. Remarque : ce code contient une méthode Tax conçue pour être utilisée avec un service différent :Note that it includes a Tax method that is intended to be used with a different service:

[ServiceContract()]
public interface IPurchaseOrder
{
    [OperationContract()]
    int Tax();

    [OperationContract(ProtectionLevel = ProtectionLevel.Sign)]
    int Price();
}
<ServiceContract()> _
Public Interface IPurchaseOrder
    <OperationContract()> _
    Function Tax() As Integer

    <OperationContract(ProtectionLevel := ProtectionLevel.Sign)> _
    Function Price() As Integer
End Interface

Lorsque le client appelle la méthode Price, il lève une exception lorsqu'il reçoit une réponse du service.When the client calls the Price method, it throws an exception when it receives a reply from the service. Cela se produit parce que le client ne spécifie pas de ProtectionLevel sur le ServiceContractAttribute. Par conséquent, le client utilise la valeur par défaut (EncryptAndSign) pour toutes les méthodes, y compris pour la méthode Price.This occurs because the client does not specify a ProtectionLevel on the ServiceContractAttribute, and therefore the client uses the default (EncryptAndSign) for all methods, including the Price method. Toutefois, le service retourne la valeur à l'aide du niveau Sign, le contrat de service définissant une seule méthode dont le niveau de protection a la valeur Sign.However, the service returns the value using the Sign level because the service contract defines a single method that has its protection level set to Sign. Dans ce cas, le client générera une erreur lors de la validation de la réponse émanant du service.In this case, the client will throw an error when validating the response from the service.

Voir aussiSee also