6

AllowPartiallyTrustedCallersAttributeカスタム例外クラスを含む でマークされたアセンブリがあります。をオーバーライドしてシリアライズ可能にしたいGetObjectData

.NET 4 ではGetObjectData、メソッドになりましたSecurityCritical。これは、オーバーライドも である必要があることを意味しますSecurityCritical。私のアセンブリは でマークされているため、特に指定しない限り、そのAllowPartiallyTrustedCallersAttribute中のすべてのコードは自動的に実行されます。SecurityTransparentしたがって、SecurityCriticalAttributeGetObjectData オーバーライドに を適用します。

using System;
using System.Runtime.Serialization;
using System.Security;

[assembly:AllowPartiallyTrustedCallers]

namespace Library
{
  [Serializable]
  public class MyException : Exception
  {
    public string String;

    public MyException ()
    {
    }

    protected MyException (SerializationInfo info, StreamingContext context)
        : base(info, context)
    {
      String = info.GetString ("String");
    }

    [SecurityCritical]
    public override void GetObjectData (System.Runtime.Serialization.SerializationInfo info, System.Runtime.Serialization.StreamingContext context)
    {
      info.AddValue ("String", String);
      base.GetObjectData (info, context);
    }
  }
}

これは、デスクトップからこのアセンブリをリンクするコードを実行する場合など、完全信頼のシナリオでは正常に機能します。

ただし、セキュリティ サンドボックス (以下を参照) からこのクラスを使用すると、次のようになりますTypeLoadException

メンバーのオーバーライド中に継承セキュリティ ルールに違反しました: 'Library.MyException.GetObjectData(System.Runtime.Serialization.SerializationInfo, System.Runtime.Serialization.StreamingContext)'。オーバーライドするメソッドのセキュリティ アクセシビリティは、オーバーライドされるメソッドのセキュリティ アクセシビリティと一致する必要があります。

私の質問:

  • なぜこの例外が発生するのですか? オーバーライドを にマークしましたがSecurityCritical、どこに問題がありますか?
  • 私のサンドボックスでは が無視されるため、SecurityCriticalAttributeIIS/ASP.NET や SQL Server などの他の部分信頼ホストでは、このクラスはどのように動作しますか?
  • .NET 4 でシリアル化可能な例外クラスを実装するにはどうすればよいですか?

サンドボックス コード:

var evidence = new Evidence();
evidence.AddHostEvidence (new Zone (SecurityZone.Internet));
var setupInfo = AppDomain.CurrentDomain.SetupInformation;
var permissionSet = SecurityManager.GetStandardSandbox (evidence);
permissionSet.AddPermission (new ReflectionPermission (ReflectionPermissionFlag.MemberAccess));
permissionSet.AddPermission (new SecurityPermission (SecurityPermissionFlag.ControlEvidence));
var sandbox = AppDomain.CreateDomain ("Sandbox", evidence, setupInfo, permissionSet);
4

3 に答える 3

1

securitycritical属性でマークされたコードは、完全に信頼できるコード以外から呼び出すことはできません。

SecurityCriticalAttribute は、完全信頼のリンク要求に相当します。SecurityCriticalAttribute でマークされた型またはメンバーは、完全に信頼されたコードによってのみ呼び出すことができます。特定の権限を要求する必要はありません。部分的に信頼されたコードから呼び出すことはできません。

securitysafecriticalattributeの使用について議論する関連する質問がここにあります。

于 2013-01-02T16:08:39.817 に答える