7

System.DataAnnotations.ValidationAttributeのサブタイプを含む[AllowPartiallyTrustedCallers]クラスライブラリがあります。ライブラリは、契約タイプのWCFサービスで使用されます。

.NET 2 / 3.5では、これは正常に機能しました。ただし、.NET 4.0以降、Visual Studioデバッガーでサービスのクライアントを実行すると、「継承セキュリティルールがタイプによって違反されました:'(ValidationAttributeの私のサブタイプ)'」という例外が発生します。派生タイプは、基本タイプのセキュリティアクセシビリティと一致する必要があります。またはアクセスしにくくなります。 "(System.TypeLoadException)

このエラーは、次のすべての条件が満たされた場合にのみ発生するように見えます。

  1. ValidationAttributeのサブクラスは、AllowPartiallyTrustedCallersアセンブリにあります
  2. リフレクションは、属性をチェックするために使用されます
  3. 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デバッグホスト(または他のホスト)を使用して動作させるにはどうすればよいですか?

どうもありがとう!ルディ

4

2 に答える 2

3

ValidationAttributeから継承するときにこの動作が発生するのに、System.Attributeから継承するときに発生しないのはなぜですか?(Reflectorを使用すると、ValidationAttributeクラスまたはそのアセンブリに特別な設定が見つかりません)

これは、System.ComponentModel.DataAnnotationsアセンブリが条件付きでAPTCAであるためです。つまり、次の属性でマークされています。

[assembly: AllowPartiallyTrustedCallers(PartialTrustVisibilityLevel = PartialTrustVisibilityLevel.NotVisibleByDefault)]

Visual Studioがホストプロセスを開始する方法に関する問題により、デフォルトのAppDomainが完全に信頼されている場合でも、CLRはこのアセンブリでAPTCAを尊重しません。これは、DataAnnotationsアセンブリのすべてのタイプとメソッドがSecurityCriticalであることを意味します。セキュリティ透過型(MyValidationAttribute)はセキュリティクリティカル型(ValidationAttribute)から継承できないため、この例外がスローされます。

そして、これを解決するために私は何ができますか?MyValidationAttributeをAllowPartiallyTrustedCallersアセンブリのValidationAttributeから継承し、SecurityCriticalとマークせずに、新しい.NET 4レベル2セキュリティモデルを使用し、VS.NETデバッグホスト(または他のホスト)を使用して動作させるにはどうすればよいですか?

これはVSホストのバグのようですが、状況によっては残念です。一方、アセンブリをAPTCAにする必要があります。必要な場合は、いくつかのオプションがあります。

  • アセンブリはそのままにしておくことができます。最も一般的な部分信頼環境であるASP.NETでは、DataAnnotationsアセンブリは常にAPTCAと見なされるため、これは有利です。もちろん、VSホスティングプロセスでデバッガーを使用することはできなくなります。
  • アセンブリにC-APTCAのマークを付けることもできます。VSホスティングプロセスでデバッガーを使用できますが、ASP.NETのアセンブリのコンシューマーは、アセンブリをAPTCAにするために、web.configの<partialTrustVisibleAssemblies>要素にアセンブリを追加する必要があります。
  • 属性をSecurityCriticalにすることができるので、デバッガーを使用でき、ASP.NETで特別な構成を行う必要はありませんが、属性を使用するすべてのクラスも重要である必要があります。
于 2010-05-30T22:15:07.457 に答える
1

どういうわけか、サイトは私が書いていたときにページにあったものとはまったく異なる質問にテキストを投稿しました-奇妙です。

于 2010-07-14T10:22:10.180 に答える