リモーティングでのシリアル化のセキュリティ

[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 オブジェクトではない型。

めんどくさいので、今回はスルー。