2013-01-02 6 views
5

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); 

Odpowiedz

1

Już sam odpowiedziałeś na pierwszą część pytania. Twój zestaw jest ładowany jako przezroczysty, ponieważ nie jest ładowany z pełnym zaufaniem, więc atrybut SecurityCritical jest ignorowany. A więc otrzymujesz wyjątek.

Zamiast przesłonić GetObjectData, należy obsłużyć zdarzenie SerializeObjectState i utworzyć typ, który implementuje ISafeSerializationData, aby zachować stan wyjątku do serializacji. Istnieją dla tego dokładnego scenariusza.

1

Nie można wywołać kodu oznaczony securitycriticalattribute od czegokolwiek, ale w pełni zaufany kod:

SecurityCriticalAttribute jest równoznaczne z żądaniem dla łącza pełna ufność . Typ lub element oznaczony atrybutem SecurityCriticalAttribute może być wywołany tylko przez całkowicie zaufany kod; nie wymaga szczegółowych zezwoleń na . Nie można go wywołać częściowo zaufanym kodem.

Istnieje powiązane pytanie here omawiające użycie securitysafecriticalattribute.

+1

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? –

+0

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

+0

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.) –

1

Cóż, wiem, że ten post jest raczej postarzały, ale z moich niedawnych obserwacji, jeśli nie dasz zespołu FullTrust w piaskownicy AppDomain, cały kod w załadowanym zespole będzie SeurityTransparent. Oznacza to, że SecurityCriticalAttribute zastosowany do MyException.GetObjectData po prostu nie zrobi nic. Będzie to SeurityTransparent i na pewno nie będzie kompatybilny z jego podstawową metodą, która jest SecurityCritical.

Mam nadzieję, że ta wskazówka przyda się.

Zobacz, jak oznaczyć określone złożenia w piaskownicy AppDomain jako FullyTrusted.