System.DataAnnotations.ValidationAttributeのサブタイプを含む[AllowPartiallyTrustedCallers]クラスライブラリがあります。ライブラリは、契約タイプのWCFサービスで使用されます。
.NET 2 / 3.5では、これは正常に機能しました。ただし、.NET 4.0以降、Visual Studioデバッガーでサービスのクライアントを実行すると、「継承セキュリティルールがタイプによって違反されました:'(ValidationAttributeの私のサブタイプ)'」という例外が発生します。派生タイプは、基本タイプのセキュリティアクセシビリティと一致する必要があります。またはアクセスしにくくなります。 "(System.TypeLoadException)
このエラーは、次のすべての条件が満たされた場合にのみ発生するように見えます。
- ValidationAttributeのサブクラスは、AllowPartiallyTrustedCallersアセンブリにあります
- リフレクションは、属性をチェックするために使用されます
- Visual Studioホスティングプロセスが有効になっている(プロジェクトプロパティのチェックボックス、[デバッグ]タブ)
つまり、基本的に、VisualStudio.NET2010では次のようになります。
- 新しいコンソールプロジェクトを作成し、
- 「System.ComponentModel.DataAnnotations」4.0.0.0への参照を追加します。
- 次のコードを記述します。
。
using System;
[assembly: System.Security.AllowPartiallyTrustedCallers()]
namespace TestingVaidationAttributeSecurity
{
public class MyValidationAttribute : System.ComponentModel.DataAnnotations.ValidationAttribute
{ }
[MyValidation]
public class FooBar
{ }
class Program
{
static void Main(string[] args)
{
Console.WriteLine("ValidationAttribute IsCritical: {0}",
typeof(System.ComponentModel.DataAnnotations.ValidationAttribute).IsSecurityCritical);
FooBar fb = new FooBar();
fb.GetType().GetCustomAttributes(true);
Console.WriteLine("Press enter to end.");
Console.ReadLine();
}
}
}
- F5キーを押すと、例外が発生します。
Ctrl-F5(デバッグなしで開始)を押すと、例外なくすべて正常に動作します...
奇妙なことに、ValidationAttributeは、プログラムの実行方法(F5またはCtrl + F5)に応じて、セキュリティクリティカルになる場合とそうでない場合があります。上記のコードのConsole.WriteLineで示されているように。しかし、繰り返しになりますが、これは他の属性(およびタイプ?)でも発生するようです。
今質問...
ValidationAttributeから継承するときにこの動作が発生するのに、System.Attributeから継承するときに発生しないのはなぜですか?(Reflectorを使用すると、ValidationAttributeクラスまたはそのアセンブリに特別な設定が見つかりません)
そして、これを解決するために私は何ができますか?MyValidationAttributeをAllowPartiallyTrustedCallersアセンブリのValidationAttributeから継承し、SecurityCriticalとマークせずに、新しい.NET 4レベル2セキュリティモデルを使用し、VS.NETデバッグホスト(または他のホスト)を使用して動作させるにはどうすればよいですか?
どうもありがとう!ルディ