关于asp.net:NonPublic在中等信任的反射中导致权限错误

NonPublic causing a permissions error in reflection on medium trust

我必须说,到目前为止,我可能只是运气不佳,因为我从来没有遇到过与中等信任度下运行的网站相关的问题。我只开发过内部网应用程序,或者碰巧使用了一家完全信任的托管公司。但是我最近被要求在Medium Trust上运行一个项目的主机,所以我正在尝试让我的应用程序运行这个。几个问题-我是在Windows XP上开发的。是否可以将其上的IIS配置为中等信任(更易于调试)和/或它是web.config设置?这门学科的信息丰富,学习曲线陡峭。

其次,在大量修改和删除代码之后,我认为这一行导致了权限错误:

对于类型为.getFields(bindingFlags.instance或bindingFlags.nonpublic或bindingFlags.public)中的每个FieldInfo作为FieldInfo

有人能澄清这是一个可能的候选人,特别是那个非公开的标志吗?这是复制粘贴的代码(编码恐怖突出了这一风险),所以我从来没有真正考虑过。我假设循环是通过对象中的每个字段(公共字段和非公共字段)进行的,并且我已经阅读到,受保护字段是禁止的,并且考虑到介质信任。

干杯,Rob。


抱歉,非公开的反射等同于完全信任。

如果不知何故,我没有完全信任,但有非公开的反射,我可以利用它来更改我自己的代码信任级别(可写字符串等)。


是的,可以将xp上的网站配置为在中等信任下运行:

部分添加以下内容:

1
2
<!-- Case is important: it's Medium, not medium -->
<trust level="Medium"/>

你就在那里。

您可能会发现,大多数主机在稍微提升的"中等"信任设置下运行其站点,并且拥有一些超出默认值的额外权限-他们的技术人员应该能够告诉您他们之间有什么区别(如果有的话)。

如果你看一下:

1
C:\Windows\Microsoft.NET\Framework\v2.0.50727\CONFIG\web_mediumtrust.config

您将看到应用的默认设置。

反射是限制中等信任的关键因素之一-从getfields页面的备注中可以看出:

If the requested field is non-public and the caller does not have ReflectionPermission to reflect non-public objects outside the current assembly, this method returns a null reference (Nothing in Visual Basic).

因为这有可能返回空值,所以在开始迭代之前应该检查空值,或者在使用FieldInfo之前检查它是否不是空值/空值。


我将把这个标记为关闭,因为没有人回答,而且它也证明了太麻烦了,无法尝试重新编码。这个程序的编写并不糟糕,但是在对象映射中使用了大量的反射,老实说,找到一家支持完全信任的托管公司更容易。