尝试为 Medium Trust 开发是不是会失败?

Posted

技术标签:

【中文标题】尝试为 Medium Trust 开发是不是会失败?【英文标题】:Is trying to develop for Medium Trust a lost cause?尝试为 Medium Trust 开发是否会失败? 【发布时间】:2013-05-26 19:59:53 【问题描述】:

我开始使用实体框架代码优先和 Unity 来开发新的 MVC 应用程序以进行依赖注入。我使用了 EF5 和 Unity,因为我认为它们应该在 Medium Trust 中工作。但是,当我在web.config 中添加<trust level="Medium" /> 标记时,我开始收到反射权限异常。

似乎每当我超出使用诸如System.Data.SqlClient ADO.net 之类的内置内容时,我总是在 Medium Trust 中遇到问题。自动映射器:失败。 NHibernate:失败。 mysql:失败。 EF5 代码优先:失败。国际奥委会:失败。

我只是在追逐白日梦吗?是否有可能使用现代技术实现一个架构良好且可测试的 Web 应用程序,该应用程序将以中等信任度运行?

在虚拟机/虚拟服务器/云计算时代(甚至一些共享主机会将您的应用程序池设置为完全信任),有没有人发现为中等信任进行开发值得付出努力?

【问题讨论】:

【参考方案1】:

ASP.NET 团队的官方立场是 Medium Trust 已过时。这意味着几件事:

我们会自动解决所有报告给我们的“无法修复”的中等信任相关错误。 我们已向托管商提供了指导,他们应该从 Medium Trust 迁移并改用适当的操作系统级隔离 (http://support.microsoft.com/kb/2698981)。 我们正在从我们开发的框架(MVC、WebAPI、SignalR 等)中移除对中等信任的支持。展望未来,基于这些框架构建的应用程序将需要完全信任。

在此,上述术语“中信任”是指 ASP.NET 中的所有非完全信任配置,包括使用内置信任级别(最小、低、中、高)或任何自定义信任级别。

2015 年 5 月 26 日编辑: .NET Framework 作为一个整体已弃用部分信任,建议客户不要依赖它作为安全边界。 From MSDN:

.NET Framework 中的代码访问安全性不应用作 部分可信代码的安全边界,尤其是 来历不明。我们建议不要加载和执行以下代码 来源不明而未采取替代安全措施 地点。

【讨论】:

你能添加一个链接到说明这个官方立场的文章吗? 史蒂文:support.microsoft.com/kb/2698981 是主要文章。还有一些其他的,例如asp.net/aspnet/overview/web-development-best-practices/…。 我知道这已经晚了,但谢谢你,这清楚了很多。即使是在 2018 年,这仍然非常重要。我发现有很多服务器托管提供商仍然强制实施部分信任(至少在小型项目的共享服务器上)。我一直在寻找提供商,到目前为止,我已经尝试了四家不同的公司,所有这些公司都强制要求对其服务器上的所有应用程序进行“中等”信任。当然,根据您的文章和问题,使用较新版本的 ASP.NET 构建的项目甚至不编译部分权限。至少可以这么说,这可能很烦人【参考方案2】:

一般来说,所有需要深度反射的东西都不能在 Medium Trust 上运行

在你的情况下:

Automapper:使用反射来发现匹配的属性和内存流来克隆它们(有一个版本实际上可以在中等信任下工作,但有一些限制)

NHibernate:使用反射发射来允许延迟加载,因为 NH 中的延迟加载是由代理实现的(为避免这种情况,您可以禁用延迟加载或使用 NHibernate ProxyGenerator,它是一个有助于预先创建代理的实用程序)

Nhibernate ProxyGenerator

EF:实际上我没有发现 EF 和 Medium Trust 的大问题....不要序列化具有关联或集合的对象

IoC:IoC 是反射的杀手级应用 :) 您可以尝试在 Medium Trust 上运行的 AutoFac

AutoFac

一般来说,中等信任度是一个很大的限制……但这完全取决于您从事的项目类型。 还可以考虑使用像 Arvixe 这样的完全信任托管

希望对你有帮助

【讨论】:

感谢您的回复。在 EF5 中,您可以通过将所有属性上的公共 getter 和 setter 持久化到数据库来解决 MT 问题。问题是您不希望用户能够设置某些属性。据说这已在 EF6 中得到修复。 Unity 似乎也适用于 Medium Trust。我想最后我想知道为 Medium Trust 开发是否值得所有努力?有没有人通过开发在共享主机上运行的网络应用程序来赚钱?如果客户使用廉价托管,他们愿意为您的应用付费的可能性有多大?

以上是关于尝试为 Medium Trust 开发是不是会失败?的主要内容,如果未能解决你的问题,请参考以下文章

Trust

在 Medium Trust 中调用内部方法

CWE-501: Trust Boundary Violation违反信任边界的代码漏洞缺陷

启用AWS EMR专职KDC跨域信任(Cross-Realm Trust)的注意事项

启用AWS EMR专职KDC跨域信任(Cross-Realm Trust)的注意事项

fiddler抓取https数据失败,全部显示“Tunnel to......443”