リモーティングでのシリアル化のセキュリティ
[Serializable] public class Hoge { }
こんな型を定義して、クライアント側でインスタンス化してリモーティングでSAOオブジェクトのメソッドを呼び出したら、
セキュリティ制限のため、Hoge型にアクセスできません
みたいな例外が投げられた。
戻り値としてHogeクラスを返すメソッドでは、問題なく動作したので、色々調べてみたら自動逆シリアル化の設定が必要のこと。
なので、サーバー側の構成ファイルに以下の設定を追加した。
<configuration> <system.runtime.remoting> <application> <channels> <channel ref="http" port="9999"> <!-- ここを追加 ↓ --> <serverProviders> <provider ref="wsdl" /> <formatter ref="soap" typeFilterLevel="Full" /> <formatter ref="binary" typeFilterLevel="Full" /> </serverProviders> <!-- ここまで --> </channel> </channels> </application> </system.runtime.remoting> </configuration>
typeFilterLevelが規定ではLowらしいので、それをFullレベルにすると問題なく動作した。
セキュリティ的にはどうなのという話があるけど、Lowレベルでも動作させるためには以下の条件があるみたい。
- プリミティブ型、およびプリミティブ型で構成されている参照型と値型。
- SerializableAttribute 属性でマークされていて、ISerializable インターフェイスを実装しない参照型と値型。
- システムによって提供され、ISerializable を実装し、シリアル化以外では何も要求しない型。
- 厳密な名前を持ち、AllowPartiallyTrustedCallersAttribute 属性でマークされていないアセンブリにあるカスタム型。
- ISerializable を実装し、シリアル化以外では何も要求しないカスタム型。
- ILease インターフェイスを実装し、MarshalByRefObject オブジェクトではない型。
めんどくさいので、今回はスルー。