次の方法で共有


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 値のいずれか 1 つ。 既定値は、None です。

注釈

ProtectionLevel 属性または MessageHeaderAttribute 属性のいずれかで MessageBodyMemberAttribute プロパティを使用するには、バインドと動作を正しく構成する必要があります。 正しく構成せずにこれらのセキュリティ機能を使用した (たとえば、セキュリティ資格情報を設定せずにメッセージの一部に ProtectionLevel.Sign を使用した) 場合は、実行時に例外がスローされます。

さらに、保護レベルは、ヘッダーごとに個別に決定されます。 ただし、SOAP 本文には、本文の部分数に関係なく、1 つの保護レベルが設定されます。 本文の保護レベルは、本文のすべての部分の中で一番高い 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 部分に低い保護レベルが設定されている場合でも、少なくとも 1 つの本文部分 (comments) にdiagnosis が設定されているため、メッセージ本文全体が暗号化および署名されます。

実行時の保護動作は、次のプロパティに設定された保護レベルの値を組み合わせたものになります。 こうしたプロパティは、階層構造を持ちます。 最も外側の値を設定すると、それより狭いスコープで異なる値を明示的に設定していなければ、より狭いスコープでその既定の設定が定まります。 この場合、外側の値は特に設定された値を除いて、それより狭いすべてのスコープで既定の設定として残ります。

たとえば、ServiceContractAttribute.ProtectionLevelProtectionLevel.EncryptAndSign に設定され、他のより狭いスコープに保護レベル設定が存在しない場合、操作コントラクト内のすべてのメッセージが暗号化および署名されます。 ただし、こうした操作の 1 つで OperationContractAttributeProtectionLevel.Sign に設定されている場合、その操作のメッセージは署名されますが、コントラクト内の他のすべてのメッセージは暗号化および署名されます。

保護レベルとその前提条件とスコープの詳細については、「 保護レベルについて」を参照してください。

こうした値が設定されるスコープは次のとおりです。

ServiceContractAttribute.ProtectionLevel

OperationContractAttribute.ProtectionLevel

FaultContractAttribute.ProtectionLevel

MessageContractAttribute.ProtectionLevel

MessageContractMemberAttribute.ProtectionLevelSystem.ServiceModel.MessageHeaderAttribute プロパティ。

MessageContractMemberAttribute.ProtectionLevelSystem.ServiceModel.MessageBodyMemberAttribute プロパティ。

コントラクト上で明示的に指定された保護レベルが存在せず、基になるバインドで (トランスポート レベルまたはメッセージ レベルを問わず) セキュリティをサポートする場合、コントラクト全体の有効な保護レベルは ProtectionLevel.EncryptAndSign です。 バインドで (BasicHttpBinding などの) セキュリティをサポートしない場合、コントラクト全体の有効な System.Net.Security.ProtectionLevelProtectionLevel.None です。 したがって、コントラクトで ProtectionLevel.None を指定している場合でも、エンドポイント バインドによってはクライアントが要求するメッセージ レベルまたはトランスポート レベルのセキュリティ保護が異なる場合があります。

適用対象