Основные сведения об уровне защитыUnderstanding Protection Level

Свойство ProtectionLevel обнаруживается во многих классах, например в классах ServiceContractAttribute и OperationContractAttribute.The ProtectionLevel property is found on many different classes, such as the ServiceContractAttribute and the OperationContractAttribute classes. Это свойство определяет, как защищается часть сообщения (или все сообщение).The property controls how a part (or whole) of a message is protected. В этом разделе объясняется функция Windows Communication Foundation (WCF) и принципы ее работы.This topic explains the Windows Communication Foundation (WCF) feature and how it works.

Инструкции по настройке уровня защиты см. в разделе инструкции. Установка свойства ProtectionLevel.For instructions on setting the protection level, see How to: Set the ProtectionLevel Property.

Примечание

Уровни защиты можно задавать только в коде, а не в конфигурации.Protection levels can be set only in code, not in configuration.

Основные сведенияBasics

Ниже приведены основные сведения о функции уровня защиты.To understand the protection level feature, the following basic statements apply:

  • Для любой части сообщения существуют три базовых уровня защиты.Three basic levels of protection exist for any part of a message. Для свойства (где бы оно ни появлялось) задается одно из значений перечисления ProtectionLevel.The property (wherever it occurs) is set to one of the ProtectionLevel enumeration values. Эти значения указаны ниже в порядке возрастания уровня защиты.In ascending order of protection, they include:

    • NoneNone.

    • SignSign. Защищенная часть подписывается цифровой подписью.The protected part is digitally signed. Это гарантирует защиту защищенной части сообщения от любой подделки.This ensures detection of any tampering with the protected message part.

    • EncryptAndSignEncryptAndSign. Для обеспечения конфиденциальности часть сообщения перед подписанием шифруется.The message part is encrypted to ensure confidentiality before it is signed.

  • Вы можете задать требования к защите только для данных приложений с помощью этой функции.You can set protection requirements only for application data with this feature. Например, заголовки WS-Addressing являются данными инфраструктуры и, следовательно, ProtectionLevel их не затрагивает.For example, WS-Addressing headers are infrastructure data and, therefore, are not affected by the ProtectionLevel.

  • Когда для режима безопасности задано значение Transport, все сообщение защищается механизмом транспорта.When the security mode is set to Transport, the entire message is protected by the transport mechanism. Поэтому установка отдельного уровня защиты для разных частей сообщения не имеет эффекта.Therefore, setting a separate protection level for different parts of a message has no effect.

  • @No__t-0 — это способ, которым разработчик может задать минимальный уровень соответствия привязки.The ProtectionLevel is a way for the developer to set the minimum level that a binding must comply with. Когда служба развернута, фактическая привязка, заданная в конфигурации, может поддерживать или не поддерживать этот минимальный уровень.When a service is deployed, the actual binding specified in configuration may or may not support the minimum level. Например, по умолчанию класс BasicHttpBinding не обеспечивает безопасность (хотя обеспечение безопасности может быть включено).For example, by default, the BasicHttpBinding class does not supply security (although it can be enabled). Поэтому использование этого класса с контрактом, параметр которого отличен от None, будет приводить к вызову исключения.Therefore, using it with a contract that has any setting other than None will cause an exception to be thrown.

  • Если для службы требуется, чтобы минимальное ProtectionLevel для всех сообщений Sign, клиент (возможно, созданный технологией, не относящейся к WCF) может шифровать и подписать все сообщения (которые больше минимального необходимого).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). В этом случае WCF не создает исключение, так как клиент выполнил больше минимума.In this case, WCF will not throw an exception because the client has done more than the minimum. Однако обратите внимание, что приложения WCF (службы или клиенты) не будут перебезопасовать часть сообщения, если это возможно, но будут соответствовать минимальному уровню.Note, however, that WCF applications (services or clients) will not over-secure a message part if possible but will comply with the minimum level. Обратите также внимание, что при использовании режима Transport в качестве режима безопасности транспорт может чрезмерно защищать поток сообщений, поскольку он не способен обеспечить защиту на более детальном уровне.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.

  • Если для ProtectionLevel явно задается значение Sign или EncryptAndSign, необходимо использовать привязку с разрешенным обеспечением безопасности. В противном случае будет вызвано исключение.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.

  • Если выбирается привязка, разрешающая обеспечение безопасности, а свойство ProtectionLevel нигде в контракте не задается, все данные приложений будут шифроваться и подписываться.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.

  • Если выбирается привязка, в которой не разрешено обеспечение безопасности (например, в классе BasicHttpBinding обеспечение безопасности запрещено по умолчанию), и уровень ProtectionLevel явно не задан, данные приложений защищаться не будут.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.

  • Если используется привязка, которая обеспечивает безопасность на транспортном уровне, все данные приложений будут защищаться в соответствии с возможностями транспорта.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.

  • Если используется привязка, которая обеспечивает безопасность на уровне сообщений, данные приложений будут защищаться в соответствии с уровнями защиты, заданными в контракте.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. Если уровень защиты не задается, все данные приложений в сообщениях будут шифроваться и подписываться.If you do not specify a protection level, then all application data in the messages will be encrypted and signed.

  • ProtectionLevel можно задать на разных уровнях области действия.The ProtectionLevel can be set at different scoping levels. Существует иерархия, связанная с областью действия, которая рассматривается в следующем разделе.There is a hierarchy associated with scoping, which is explained in the next section.

Область действияScoping

При задании ProtectionLevel на самом верхнем API задается уровень для всех уровней ниже данного.Setting the ProtectionLevel on the topmost API sets the level for all levels below it. Если для ProtectionLevel задается другое значение на более низком уровне, все интерфейсы API, расположенные ниже этого уровня в иерархии, сбрасываются на этот новый уровень (однако интерфейсы API, расположенные выше этого уровня, остаются под влиянием самого верхнего уровня).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). Иерархия имеет представленный ниже вид.The hierarchy is as follows. Атрибуты на одном и том же уровне являются одноранговыми.Attributes at the same level are peers.

Программирование ProtectionLevelProgramming ProtectionLevel

Чтобы запрограммировать ProtectionLevel в любом месте иерархии, задайте для этого свойства соответствующее значение при применении атрибута.To program the ProtectionLevel at any point in the hierarchy, simply set the property to an appropriate value when applying the attribute. Примеры см. в разделе как задать свойство ProtectionLevel.For examples, see How to: Set the ProtectionLevel Property.

Примечание

Чтобы задать данное свойство в контрактах сбоев и сообщений, необходимо понимать работу этих функций.Setting the property on faults and message contracts requires understanding how those features work. Дополнительные сведения см. в разделе инструкции. Установка свойства ProtectionLevel и использование контрактов сообщений.For more information, see How to: Set the ProtectionLevel Property and Using Message Contracts.

Зависимость от WS-AddressingWS-Addressing Dependency

В большинстве случаев использование средства служебной программы метаданных ServiceModel (Svcutil. exe) для создания клиента гарантирует идентичность клиентских и сервисных контрактов.In most cases, using the ServiceModel Metadata Utility Tool (Svcutil.exe) to generate a client ensures that the client and service contracts are identical. Однако одинаковые на первый взгляд контракты могут приводить к вызову клиентом исключения.However, seemingly identical contracts can cause the client to throw an exception. Это происходит всякий раз, когда привязка не поддерживает спецификацию WS-Addressing и в контракте определено несколько уровней защиты.This occurs whenever a binding does not support the WS-Addressing specification and multiple levels of protection are specified on the contract. Например, это происходит при использовании класса BasicHttpBinding, не поддерживающего данную спецификацию, или при создании пользовательской привязки, которая не поддерживает 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. Чтобы в одном контракте разрешить разные уровни защиты, функция ProtectionLevel полагается на спецификацию WS-Addressing.The ProtectionLevel feature relies on the WS-Addressing specification to enable different protection levels on a single contract. Если привязка не поддерживает спецификацию WS-Addressing, для всех уровней задается один и тот же уровень защиты.If the binding does not support the WS-Addressing specification, all levels will be set to the same protection level. В качестве фактического уровня защиты для всех областей в контракте задается уровень самой мощной защиты, используемый в контракте.The effective protection level for all scopes on the contract will be set to the strongest protection level used on the contract.

Это может привести к проблеме, которую на первый взгляд сложно устранить.This may cause a problem that is hard to debug at first glance. Можно создать контракт клиента (интерфейс), который содержит методы для нескольких служб.It is possible to create a client contract (an interface) that includes methods for more than one service. То есть для создания клиента, взаимодействующего с несколькими службами, используется один и тот же интерфейс, и этот единственный интерфейс содержит методы для всех служб.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. Разработчику следует быть внимательным в этом редком сценарии, чтобы обеспечить вызов только тех методов, которые подходят для каждой конкретной службы.The developer must take care in this rare scenario to invoke only those methods that are applicable for each particular service. Если привязкой является класс BasicHttpBinding, поддержка нескольких уровней защиты невозможна.If the binding is the BasicHttpBinding class, multiple protection levels cannot be supported. Однако служба, отвечающая клиенту, может ответить и клиенту с более низким уровнем защиты, чем требуется.However, a service replying to the client might respond to a client with a lower protection level than required. В этом случае клиент вызовет исключение, поскольку он ожидает более высокий уровень защиты.In this case, the client will throw an exception because it expects a higher protection level.

В примере кода иллюстрируется эта проблема.An example of the code illustrates this problem. В представленном ниже примере показаны контракты службы и клиента.The following example shows a service and a client contract. Предположим, что привязка является элементом <basicHttpBinding > .Assume that the binding is the <basicHttpBinding> element. Следовательно, все операции в контракте имеют один и тот же уровень защиты.Therefore, all operations on a contract have the same protection level. Этот одинаковый уровень защиты определяется как максимальный уровень защиты для всех операций.This uniform protection level is determined as the maximum protection level across all operations.

Ниже приведен контракт службы: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

В следующем коде показан интерфейс контракта клиента.The following code shows the client contract interface. Обратите внимание, что он содержит метод Tax, предназначенный для использования с другой службой: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

Когда клиент вызывает метод Price, при получении ответа от службы он вызывает исключение.When the client calls the Price method, it throws an exception when it receives a reply from the service. Причина этого в том, что клиент не задает ProtectionLevel в ServiceContractAttribute и, следовательно, использует значение по умолчанию (EncryptAndSign) для всех методов, включая метод 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. Однако служба возвращает значение, используя уровень Sign, поскольку контракт службы определяет единственный метод, в качестве уровня защиты которого задано значение 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. В этом случае при проверке ответа от службы клиент вызовет ошибку.In this case, the client will throw an error when validating the response from the service.

См. такжеSee also