gpt4 book ai didi

c# - 如何在具有 AllowPartiallyTrustedCallersAttribute 的库程序集中的 .NET 4 中实现 Exception.GetObjectData?

转载 作者:太空狗 更新时间:2023-10-29 21:45:39 31 4
gpt4 key购买 nike

我有一个标有 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:

Inheritance security rules violated while overriding member: 'Library.MyException.GetObjectData(System.Runtime.Serialization.SerializationInfo, System.Runtime.Serialization.StreamingContext)'. Security accessibility of the overriding method must match the security accessibility of the method being overriden.

我的问题:

  • 为什么我会收到此异常?我确实将覆盖标记为 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);

最佳答案

您已经自己回答了问题的第一部分。您的程序集正在以安全透明的方式加载,因为它没有以完全信任的方式加载,因此 SecurityCritical 属性将被忽略。所以你得到了异常(exception)。

您应该处理 SerializeObjectState 而不是覆盖 GetObjectData事件并创建一个实现 ISafeSerializationData 的类型存储序列化的异常状态。这些存在于这个确切的场景中。

关于c# - 如何在具有 AllowPartiallyTrustedCallersAttribute 的库程序集中的 .NET 4 中实现 Exception.GetObjectData?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14124874/

31 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com