MessageContractMemberAttribute.ProtectionLevel Свойство
Определение
Важно!
Некоторые сведения относятся к предварительной версии продукта, в которую до выпуска могут быть внесены существенные изменения. Майкрософт не предоставляет никаких гарантий, явных или подразумеваемых, относительно приведенных здесь сведений.
Задает значение, указывающее, должен ли член передаваться "как есть", подписанным или подписанным и зашифрованным.
public:
property System::Net::Security::ProtectionLevel ProtectionLevel { System::Net::Security::ProtectionLevel get(); void set(System::Net::Security::ProtectionLevel value); };
public System.Net.Security.ProtectionLevel ProtectionLevel { get; set; }
member this.ProtectionLevel : System.Net.Security.ProtectionLevel with get, set
Public Property ProtectionLevel As ProtectionLevel
Значение свойства
Одно из значений перечисления ProtectionLevel. Значение по умолчанию — None.
Комментарии
Чтобы использовать свойство ProtectionLevel в атрибутах MessageHeaderAttribute или MessageBodyMemberAttribute, следует правильно настроить привязку и поведения. При использовании этих средств безопасности без надлежащей настройки (например, при использовании ProtectionLevel.Sign с частью сообщения без предоставления учетных данных) во время выполнения будет сформировано исключение.
Кроме того, уровень защиты определяется отдельно для каждого заголовка. Однако текст SOAP имеет только один уровень защиты, независимо от количества разделов текста. Уровень защиты текста определяется наивысшим из значений свойства ProtectionLevel всех разделов текста. Например, рассмотрим следующий класс.
[MessageContract]
public class PatientRecord
{
[MessageHeader(ProtectionLevel=None)] public int recordID;
[MessageHeader(ProtectionLevel=Sign)] public string patientName;
[MessageHeader(ProtectionLevel=EncryptAndSign)] public string SSN;
[MessageBody(ProtectionLevel=None)] public string comments;
[MessageBody(ProtectionLevel=Sign)] public string diagnosis;
[MessageBody(ProtectionLevel=EncryptAndSign)] public string medicalHistory;
}
В этом примере заголовок recordID
не защищается, заголовок patientName
подписывается, а заголовок SSN
шифруется и подписывается. Как минимум к одному разделу текста — medicalHistory
— применено свойство ProtectionLevel.EncryptAndSign, следовательно, весь текст сообщения шифруется и подписывается, хотя для разделов comments
и diagnosis
заданы более низкие уровни защиты.
Поведение защиты в среде выполнения представляет собой сочетание значений уровня защиты, заданных для следующих свойств. Эти свойства имеют иерархическую структуру. При задании внешнего значения устанавливается значение по умолчанию для всех более узких областей, если явно не задано другое значение для более узкой области. В этом случае внешнее значение остается значением по умолчанию для всех более узких областей за исключением тех областей, для которых задано иное значение.
Например, если для уровня ServiceContractAttribute.ProtectionLevel задано значение ProtectionLevel.EncryptAndSign и другие более узкие области не имеют параметров уровня защиты, все сообщения в контракте операции шифруются и подписываются. Однако если атрибуту OperationContractAttribute одной из этих операций присвоено значение ProtectionLevel.Sign, сообщения для этой операции подписываются, а все другие сообщения в контракте шифруются и подписываются.
Дополнительные сведения об уровнях защиты, их предположениях и областях см. в разделе Основные сведения об уровне защиты.
Ниже приводятся области, в которых заданы эти значения.
ServiceContractAttribute.ProtectionLevel
OperationContractAttribute.ProtectionLevel
FaultContractAttribute.ProtectionLevel
MessageContractAttribute.ProtectionLevel
Свойство MessageContractMemberAttribute.ProtectionLevel атрибута System.ServiceModel.MessageHeaderAttribute.
Свойство MessageContractMemberAttribute.ProtectionLevel атрибута System.ServiceModel.MessageBodyMemberAttribute.
Если в контракте отсутствует явно заданный уровень защиты, а базовая привязка поддерживает безопасность (как на транспортном уровне, так и на уровне сообщений), эффективным уровнем защиты для всего контракта является ProtectionLevel.EncryptAndSign. Если привязка не поддерживает безопасность (например, BasicHttpBinding), эффективным уровнем System.Net.Security.ProtectionLevel является ProtectionLevel.None для всего контракта. В результате в зависимости от привязки конечной точки клиенты могут требовать разную степень защиты на уровне сообщений или транспортном уровне, даже если контракт задает ProtectionLevel.None.