部分信頼機能の互換性
部分信頼環境で実行される場合、Windows Communication Foundation (WCF) でサポートされる機能は、限られたサブセットになります。部分信頼でサポートされる機能は、「サポートされている配置シナリオ」のトピックで説明される特定のシナリオを念頭にデザインされています。
最小のアクセス許可の要件
WCF では、次の標準の名前付きアクセス許可セットのいずれかで実行されるアプリケーションの機能のサブセットをサポートします。
中程度の信頼アクセス許可
インターネット ゾーン アクセス許可
これよりも制限の厳しいアクセス許可が設定された部分信頼アプリケーションで WCF を使用すると、実行時にセキュリティ例外が発生することがあります。
コントラクト
部分信頼で実行される場合、コントラクトには次の制限があります。
[ServiceContract]
インターフェイスを実装するサービス クラスは、public であること、および public コンストラクターを持っていることが必要です。このクラスで[OperationContract]
メソッドを定義する場合、それらも public である必要があります。代わりに[ServiceContract]
インターフェイスを実装する場合は、[ServiceContract]
インターフェイスが public であれば、それらのメソッド実装は明示的でも private でもかまいません。[ServiceKnownType]
属性を使用するときは、指定するメソッドは public である必要があります。[MessageContract]
クラスとそのメンバーは、public である場合があります。[MessageContract]
クラスがアプリケーション アセンブリで定義されている場合は、internal であり、internal メンバーを持つ場合があります。
システム指定のバインディング
部分信頼環境では、BasicHttpBinding と WebHttpBinding が完全にサポートされています。WSHttpBinding は、トランスポート セキュリティ モードでのみサポートされます。
NetTcpBinding、NetNamedPipeBinding、または NetMsmqBinding など、HTTP 以外のトランスポートを使用するバインディングは、部分信頼環境で実行される場合はサポートされません。
カスタム バインディング
部分信頼環境ではカスタム バインディングの作成と使用が可能ですが、このセクションに示した制限に従う必要があります。
トランスポート
使用できるトランスポート バインド要素は、HttpTransportBindingElement と HttpsTransportBindingElement に限られます。
エンコーダー
次のエンコーダーを指定できます。
テキスト エンコーダー (TextMessageEncodingBindingElement)
バイナリ エンコーダー (BinaryMessageEncodingBindingElement)
Web メッセージ エンコーダー (WebMessageEncodingBindingElement)
MTOM (Message Transmission Optimization Mechanism) エンコーダーはサポートされていません。
セキュリティ
部分信頼アプリケーションは、通信をセキュリティで保護するために WCF のトランスポート レベルのセキュリティ機能を使用することがあります。メッセージ レベルのセキュリティはサポートされていません。メッセージ レベルのセキュリティを使用するようにバインディングを構成すると、実行時に例外が発生します。
サポートされないバインディング
信頼できるメッセージング、トランザクション、またはメッセージ レベルのセキュリティを使用するバインディングはサポートされません。
シリアル化
部分信頼環境では、DataContractSerializer と XmlSerializer の両方がサポートされています。ただし、DataContractSerializer の使用は、次の条件に従う必要があります。
シリアル化可能なすべての
[DataContract]
型は public である必要があります。[DataContract]
型にあるシリアル化可能なすべての[DataMember]
フィールドまたはプロパティは、パブリックで読み書き可能である必要があります。読み取り専用フィールドのシリアル化と逆シリアル化は、WCF を部分信頼アプリケーションで実行する場合にはサポートされません。部分信頼環境では、
[Serializable]
/ISerializable プログラミング モデルはサポートされていません。既知の型はコード内、またはマシン レベルの構成 (machine.config) で指定する必要があります。既知の型はセキュリティ上の理由からアプリケーション レベルの構成では指定できません。
IObjectReference を実装する型は、部分信頼環境では例外をスローします。
部分信頼アプリケーションで DataContractSerializer を安全に使用する場合のセキュリティ情報の詳細については、「部分信頼のベスト プラクティス」のシリアル化のセクションを参照してください。
コレクション型
コレクション型の中には、IEnumerable と IEnumerable の両方を実装するものがあります。たとえば、ICollection を実装する型がこれに当たります。このような型では、GetEnumerator()
の public な実装と、GetEnumerator()
の明示的な実装を実装できます。この場合、DataContractSerializer は GetEnumerator()
の public な実装を呼び出し、GetEnumerator()
の明示的な実装は呼び出しません。GetEnumerator()
実装のいずれも public ではなく、すべてが明示的な実装である場合、DataContractSerializer
は IEnumerable.GetEnumerator()
を呼び出します。
WCF が部分信頼環境で実行されているときに、コレクション型の GetEnumerator()
の実装がどれも public ではなく、またそのどれもが明示的なインターフェイスの実装でない場合は、セキュリティ例外がスローされます。
NetDataContractSerializer
部分信頼の場合、List、ArrayList、Dictionary、および Hashtable などの、.NET Framework コレクション型の多くは、NetDataContractSerializer によってサポートされていません。これらの型には [Serializable]
属性セットがあり、シリアル化のセクションで説明したように、この属性は部分信頼ではサポートされません。DataContractSerializer はコレクションを特殊な方法で扱うため、この制限を回避できますが、NetDataContractSerializer には、この制限の適用を避けるメカニズムはありません。
DateTimeOffset 型は、部分信頼では NetDataContractSerializer によってサポートされません。
部分信頼で実行するときは、(SurrogateSelector メカニズムを使用して) NetDataContractSerializer でサロゲートを使用できません。この制限は、シリアル化ではなく、サロゲートの使用に適用されることに注意してください。
実行する共通動作の有効化
アプリケーションが部分信頼環境で実行されている場合、構成ファイルの <commonBehaviors> セクションに追加された AllowPartiallyTrustedCallersAttribute 属性 (APTCA) でマークされていないサービス動作またはエンドポイント動作は実行されません。この場合、動作が実行されなくても、例外はスローされません。共通動作を強制的に実行するには、次のいずれかを行う必要があります。
共通動作を AllowPartiallyTrustedCallersAttribute 属性でマークし、部分信頼アプリケーションとして展開したときに実行できるようにします。APTCA でマークされたアセンブリを実行できないように、コンピューターでレジストリ エントリを設定できます。.
アプリケーションが完全信頼アプリケーションとして展開されている場合に、ユーザーが部分信頼環境でアプリケーションを実行するようにコード アクセス セキュリティ設定を変更できないことを確認します。ユーザーがこのような変更を行うことができる場合、動作は実行されず、例外もスローされません。これを確認するためには、Code Access Security Policy Tool (Caspol.exe) を使用した levelfinal オプションを参照してください。
共通動作の例については「方法 : 企業内のエンドポイントをロックダウンする」を参照してください。
構成
1 つの例外を除き、部分信頼コードは、ローカルの app.config
ファイルにある WCF 構成セクションのみを読み込むことができます。machine.config ファイルまたはルート web.config ファイルの WCF セクションを参照する WCF 構成セクションを読み込むには、ConfigurationPermission(Unrestricted) が必要です。このアクセス許可がない場合、ローカルの構成ファイル外の WCF 構成セクション (behaviors、bindings) を参照すると、構成の読み込み時に例外が発生します。
例外は、このトピックのシリアル化のセクションで説明したように、シリアル化の既知の型の構成です。
![]() |
---|
構成の拡張は、完全信頼で実行される場合にのみサポートされます。 |
診断
イベント ログ
部分信頼では、限定されたイベント ログがサポートされます。イベント ログには、サービス アクティベーション エラーおよびトレース/メッセージ ログ エラーのみが記録されます。イベント ログに過剰な数のメッセージが書き込まれないように、ログに記録できるイベントの最大数は 5 つです。
メッセージ ログ
WCF が部分信頼環境で実行されていると、メッセージ ログは動作しません。部分信頼環境下で有効になっても、サービスのアクティブ化には失敗しませんが、メッセージはログに記録されません。
トレース
部分信頼環境で実行される場合、利用できるトレース機能には制限があります。構成ファイルの <listeners> 要素に追加できる種類は TextWriterTraceListener と新しい EventSchemaTraceListener に限られます。標準の XmlWriterTraceListener を使用すると、ログが不完全または不正確になります。
次のトレース ソースがサポートされています。
System.IdentityModel.Claims、System.IdentityModel.Policy、System.IdentityModel.Selectors、および System.IdentityModel.Tokens。
次のトレース ソースはサポートされていません。
CardSpace
TraceOptions 列挙体の次のメンバーは指定できません。
部分信頼環境でトレースを使用する場合は、アプリケーションにトレース リスナーの出力を保存するための十分なアクセス許可があることを確認します。たとえば、TextWriterTraceListener を使用してトレース出力をテキスト ファイルに書き込む場合は、アプリケーションにトレース ファイルを書き込むために必要な FileIOPermission があることを確認します。
![]() |
---|
トレース ファイルが重複したエラーでいっぱいになるのを防ぐために、WCF では最初のセキュリティ エラーの後でリソースまたはアクションのトレースを無効にします。リソースへのアクセスまたはアクションの実行が初めて行われようとしたとき、例外トレースはリソース アクセスの各失敗に対して、1 回だけ行われます。 |
WCF サービス ホスト
WCF サービス ホストは、部分信頼をサポートしません。部分信頼において WCF サービスを使用する場合は、サービスをビルドするために Visual Studio にある WCF サービス ライブラリ プロジェクト テンプレートを使用しないでください。代わりに、WCF 部分信頼がサポートされている Web サーバーでサービスをホストできる WCF サービス Web サイト テンプレートを選択して、Visual Studio に新しい Web サイトを作成します。
他の制約
WCF は通常、ホスト アプリケーションによってもたらされるセキュリティ上の考慮事項によって制限されます。たとえば、WCF が XAML ブラウザー アプリケーション (XBAP) でホストされている場合は、「Windows Presentation Foundation 部分信頼セキュリティ」で説明されているように、XBAP の制限に従うことになります。
次の追加機能は indigo2 が部分信頼環境で実行されていると有効になりません。
WMI (Windows Management Instrumentation)
イベント ログは部分的にしか有効になりません (診断のセクションの説明を参照)。
パフォーマンス カウンター
部分信頼環境でサポートされていない WCF 機能を使用すると、実行時に例外が発生することがあります。
記載されていない機能
部分信頼環境で利用できない情報やアクションを見つけ出す最善の方法は、リソースへのアクセスまたはアクションの実行を try ブロックの内側で試みて、エラーを catch することです。トレース ファイルが重複したエラーでいっぱいになるのを防ぐために、WCF では最初のセキュリティ エラーの後でリソースまたはアクションのトレースを無効にします。リソースへのアクセスまたはアクションの実行が初めて行われようとしたとき、例外トレースはリソース アクセスの各失敗に対して、1 回だけ行われます。
参照
リファレンス
HttpTransportBindingElement
HttpsTransportBindingElement
TextMessageEncodingBindingElement
WebMessageEncodingBindingElement