MessageContractMemberAttribute.ProtectionLevel 属性
定义
重要
一些信息与预发行产品相关,相应产品在发行之前可能会进行重大修改。 对于此处提供的信息,Microsoft 不作任何明示或暗示的担保。
指定该成员是否按原样传输,是否已签名或是否已签名和加密。
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,客户端也可以要求不同的消息或传输级别安全保护。