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