在Intranet区域中实例化类时的安全问题.Net

时间:2011-03-23 20:04:11

标签: c# vb.net intranet code-access-security

我有一个嵌入在HTML页面中的.Net 2.0 activex控件(在IE7中)。 我使用javascript来修改其属性并调用方法。所有这一切都没问题,直到我调用一个使用Activator.CreateInstance(type)实例化类的方法。我收到以下消息:

  

System.Reflection.TargetInvocationException:调用目标抛出了异常。 ---> System.Security.SecurityException:请求失败   ..
  ..
  失败的动作是:InheritanceDemand
  失败的第一个权限的类型是:System.Security.PermissionSet
  失败的程序集区域是:Intranet

我试图实例化的类有一个没有parm的 public 构造函数,而且从我读过的内容来看,对公共类型的反射应该没有问题吗?

我通过使用Microsoft .NET Framework配置实用程序完成了临时修复,将Intranet信任修改为完整。请参阅here

如何修改方法,类或程序集以避免必须配置框架?

加分:

  • 编译activex控件 反对.Net 2
  • 它的装配不强名称
  • 我并不打算给予反射权限。

由于

更新

事实证明它不是导致问题的反射,它是对TypeDescriptor.GetAttributes的调用,它引发了FileIOPermission安全异常。我用以下代码解决了这个问题:

Dim temp As New Security.Permissions.FileIOPermission(Security.Permissions.PermissionState.Unrestricted)
temp.Assert()
// Get attributes
System.Security.CodeAccessPermission.RevertAssert()

现在,如果我设置了一个分配给我的程序集强名称的代码组并将权限设置为 FullTrust ,一切都很好。
但是,我似乎无法微调它,它是 FullTrust 或抛出异常(见下文)。即使 Everything 权限集也不起作用。

例外:

System.Security.SecurityException: Request failed.
at System.Reflection.CustomAttribute._CreateCaObject(Void* pModule, Void* pCtor, Byte** ppBlob, Byte* pEndBlob, Int32* pcNamedArgs)
at System.Reflection.CustomAttribute.CreateCaObject(Module module, RuntimeMethodHandle ctor, IntPtr& blob, IntPtr blobEnd, Int32& namedArgs)
at System.Reflection.CustomAttribute.GetCustomAttributes(Module decoratedModule, Int32 decoratedMetadataToken, Int32 pcaCount, RuntimeType attributeFilterType, Boolean mustBeInheritable, IList derivedAttributes)
at System.Reflection.CustomAttribute.GetCustomAttributes(RuntimeType type, RuntimeType caType, Boolean inherit)
at System.RuntimeType.GetCustomAttributes(Type attributeType, Boolean inherit)
at System.ComponentModel.ReflectTypeDescriptionProvider.ReflectGetAttributes(Type type)
at System.ComponentModel.ReflectTypeDescriptionProvider.ReflectedTypeData.GetAttributes()
at System.ComponentModel.TypeDescriptor.TypeDescriptionNode.DefaultTypeDescriptor.System.ComponentModel.ICustomTypeDescriptor.GetAttributes()
at System.ComponentModel.TypeDescriptor.GetAttributes(Object component, Boolean noCustomTypeDesc)
at System.ComponentModel.TypeDescriptor.GetAttributes(Object component)
... GetAttributes
...
The action that failed was: InheritanceDemand
The type of the first permission that failed was: System.Security.PermissionSet
The Zone of the assembly that failed was: Intranet

2 个答案:

答案 0 :(得分:2)

我会将ReflectionPermission属性添加到AssemblyInfo.cs文件中,以便试图反映到具有RequireMinimum SecurityAction的其他类的程序集。

但是,请注意,所有这一切都会阻止您的应用程序在Intranet区域运行,而不是运行一段时间,一切似乎都很好,直到反射发生。断言权限并不意味着它们将被授予,它只是允许程序“快速失败”。你可以要求任何你想要的许可; CAS的整个基础是它不必授予你。

为了在您的应用或程序集中使用反射,您必须提供足够的证据以在限制较少的区域中运行程序集(例如,通过对其进行强签名),或者将框架配置为在Intranet中包含ReflectionPermission许可集。

最后,请注意,在.NET Framework 4.0中,声明性CAS安全模型在很大程度上已弃用;如果您稍后尝试将此代码迁移到.NET 4.0,则必须更改断言权限的方式。

答案 1 :(得分:1)

  

我试图实例化的课程   有一个没有parm的公共构造函数,   从我所读到的,应该   使用反射是没有问题的   那些公共的类型呢?

如果类和构造函数都是公共的,那么通过反射调用构造函数应该没有问题。但是,非公共类的公共构造函数仍会出现问题。

那就是说,鉴于它是一个失败的继承需求,听起来实际问题可能在其他地方。如果您尝试从控制代码创建类的新实例而不使用反射会发生什么?