Mam zespół oznaczony AllowPartiallyTrustedCallersAttribute
, który zawiera niestandardową klasę wyjątków. Chcę sprawić, by był możliwy do serializacji przez przesłonięcie GetObjectData
.Jak zaimplementować Exception.GetObjectData w .NET 4 w zespole biblioteki, który ma atrybut AllowPartiallyTrustedCallersAttribute?
Z .NET 4, GetObjectData
stała się metodą SecurityCritical
. Oznacza to, że przesłonięcia również muszą być SecurityCritical
. Ponieważ mój zespół jest oznaczony numerem AllowPartiallyTrustedCallersAttribute
, cały jego kod jest automatycznie SecurityTransparent
, chyba że podano inaczej. Dlatego też stosować SecurityCriticalAttribute
do ręcznego 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);
}
}
}
Działa to dobrze w pełnych scenariuszy powierniczych, na przykład, gdy uruchamiam kod łączący ten zespół z mojego pulpitu.
Jednak kiedy używam tej klasy z izolowanym zabezpieczeń (patrz poniżej), Dostaję TypeLoadException
: zasady bezpieczeństwa
dziedziczenia naruszonych podczas nadrzędny element: „Library.MyException.GetObjectData (System .Runtime.Serialization.SerializationInfo, System.Runtime.Serialization.StreamingContext) ". Zabezpieczenia Dostępność metody przesłaniania musi być zgodna z zabezpieczeniem dostępności nadrybowanej metody.
Moje pytania:
- Dlaczego otrzymuję ten wyjątek? Zrobiłem oznaczenie zastąpienia, aby być
SecurityCritical
, więc gdzie jest problem? - Ponieważ
SecurityCriticalAttribute
jest ignorowany w mojej piaskownicy, w jaki sposób ta klasa będzie zachowywać się w innych hostach częściowego zaufania, takich jak IIS/ASP.NET lub SQL Server? - Jak zaimplementować klasę wyjątków serializowalnych w .NET 4?
Kod Sandboxing:
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);
W rzeczywistości nie wzywam członka SecurityCritical ('GetObjectData'), chcę go tylko przesłonić bez naruszania" zasad bezpieczeństwa dotyczących dziedziczenia ". Czy nie jest to możliwe z poziomu częściowo zaufanego zespołu? –
Nie sądzę, aby Twoje nadpisanie było nadal oznaczone atrybutem. Wygląda na to, że atrybut securitysafecritical dostarczy ci tego, czego chcesz. Oznaczy to twoje zastąpienie jako krytyczne pod względem bezpieczeństwa i bezpiecznie dostępne przez przezroczysty kod. Z powyższego linku: "Typy lub członkowie oznaczeni atrybutem SecuritySafeCriticalAttribute są dostępne dla częściowo zaufanych typów i członków." – vinny
Nie, 'SecuritySafeCrititcal' nie może być użyte do nadpisania metody' SecurityCritical'. (Próbowałem, z 'SecuritySafeCritical' otrzymuję wyjątek" reguły ochrony dziedziczenia "nawet z pełnym zaufaniem.) –