AllowPartiallyTrustedCallersAttribute
カスタム例外クラスを含む でマークされたアセンブリがあります。をオーバーライドしてシリアライズ可能にしたいGetObjectData
。
.NET 4 ではGetObjectData
、メソッドになりましたSecurityCritical
。これは、オーバーライドも である必要があることを意味しますSecurityCritical
。私のアセンブリは でマークされているため、特に指定しない限り、そのAllowPartiallyTrustedCallersAttribute
中のすべてのコードは自動的に実行されます。SecurityTransparent
したがって、SecurityCriticalAttribute
GetObjectData オーバーライドに を適用します。
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
、どこに問題がありますか? - 私のサンドボックスでは が無視されるため、
SecurityCriticalAttribute
IIS/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);