任何现实世界都使用"代码访问安全性"吗?

Ian*_*ose 68 .net security code-access-security

警告:

自问这个问题以来,较新版本的.Net和.Net核心已经删除和/或更改了"代码访问安全性"(CAS).

原始问题:

我正在学习70-536 .NET Framework - 应用程序开发基础考试,因为我已编程.net多年,这应该不难!

但是我不得不学习"代码访问安全性"(CAS),因为我从来没有需要使用或配置它,我想知道是否有其他人找到了它的真实生活用途?

请提供您何时使用CAS的示例,它已成为解决方案的一部分,而不是问题.

(到目前为止,其他一切都与我在.NET编程中必须完成的任务有一些关系)


相关问题:


结果到目前为止.

  • 当您托管第三方代码时,CAS非常有用.例如,网络托管公司可以使用它来阻止客户的Asp.net代码对服务器造成损害.(当.NET用作VBA的替代品时,Office也会使用它)

  • 到目前为止,它在Microsoft应用程序之外使用的唯一详细示例是:

    我最近的一个项目有类似的东西:允许用户上传一个库,并测试它的性能("谁制作最好的算法").不用说,我们在那里需要CAS.

  • CAS似乎对获得JITDC认证很有用,就像美国国防部一样,但是我不知道CAS是否具有任何实际价值,或者它是否只是盒子滴答作响.

(如果您需要绕过使用CAS的主机并且您拥有对它们的管理员权限,则可以将程序集放在GAC中.)

展望未来,CAS在.net 4中有点复杂.


至少看起来新的Microsoft考试不会有包含CAS的"基础"考试.我不知道它是否会进入新的Winforms/WPF考试.

Abe*_*bel 35

我经常在"现实世界"中遇到代码访问安全性,通常是在我最不期望的时候.在某种程度上,SilverLight将是一个非常好的现实世界应用程序,如果不是SilverLight 最终选择不使用CAS.

托管服务提供商

您在其中看到它的位置是需要安全环境的地方:当然,ASP.NET本身,但ASP.NET托管提供商使用修改后的安全模型来防止其宝贵系统的入侵.我知道Webhost4Life使用了这个(在他们的网站上没有关于它的信息,但我和他们一起工作,它确实存在).进一步看,其他ASP.NET托管服务提供商也这样做,但他们也不是很清楚:godaddy.com上的线程不想改变CAS(并且不清楚支持什么和不支持)或者这个相关的讨论1&1.一些云托管站点(rackspacecloud)更进一步,并"与Microsoft一起工作,修改了完全信任级别",无论可能是什么.

简而言之:如果您找到一个ASP.NET主机,很可能他们使用CAS来阻止您做他们不希望您做的事情.他们甚至可以使用它来区分"基本"(许多限制)托管和"企业"(少数限制)托管,这给CAS带来了另外一个意义.

CAS的其他应用

对于我自己遇到的一些现实世界的情况,这么多.我最近的一个项目有类似的东西:允许用户上传一个库,并测试它的性能("谁制作最好的算法").不用说,我们在那里需要CAS.其他示例或有趣的资源:

对于您自己完全控制的任何情况,您构建自己的应用程序和代码(或构建它)并完全控制您的系统,我认为您不会经常需要CAS.当您从较不受信任的来源运行代码时,您可以使用更多内容(基本上所有内容都不在您的完全控制之下).

CAS与ClickOnce

默认CAS设置限制从网络共享或其他非本地源运行的代码的功能.这是有道理的,但严格的限制使得很难拥有分布式应用程序的中央存储库..NET 2.0引入了ClickOnce,它本来应该提升安全性(这里讨论).

ClickOnce本身使用CAS,以防止安装程序调用系统函数.因此,我认为它可以说是依赖于CAS的最着名的应用程序.

重点是:你需要了解CAS能够创建可以直接从共享运行的东西,或者你忽略它并使用ClickOnce.

微软对CAS的调查

2005年,微软召集了一项调查,以了解为什么CAS如此不受欢迎,希望能够改进它以使其更好地适用.不幸的是,我找不到实际的调查结果,然后这篇文章稍微详细说明了为什么CAS未得到充分利用.

CAS在另一个世界

然而,这篇文章指出了一个有趣的利基:CAS适用于另一个世界:Unix/Linux.他们不称它为CAS,而是BitFrost.这对于一个真实世界的应用程序来说是怎样的:"每个孩子一台笔记本电脑"项目,它依赖于BitFrost作为传统Unix安全模型的替代品.

更新:关于Unix/Linux中CAS作为BitFrost的部分和调查部分.
更新:添加CAS与ClickOnce部分
更新:使用CAS添加资源列表(并连续为所有这些更新道歉!)


Mic*_*tum 10

从技术上讲,它非常有用,因为它允许非常精细的权限规范.这对你有好处(理论上它会使得利用安全漏洞变得更加困难 - 即使攻击者完全控制你的应用程序,他仍然被锁定在CAS沙箱中)和你的客户(因为他们可以确切地看到你的应用程序可以执行并运行自己的安全审核).

在实际使用中,它几乎毫无意义.我认为它太复杂了,可用的开发工具支持的太少,大多数用户都不关心.

当然也有例外(政府和客户真正了解.net/CAS),我很乐意说CAS绝对有用且强制性,但现实中说的是一种清晰的语言.


Mar*_*ell 5

读者注意:见下面的两条评论; 听起来我不小心将CAS的定义夸大到(错误地)包括RBS.我会在这里留下答案供参考,但要注意区别.


CAS有两个小问题; 你在考试中看到的最重要的是代码调用其他代码的所有细微差别,这可能对部分信任有用,但大多数时候它只是一种痛苦 - 更糟糕的是:如果你的代码完全信任(其中大部分/太多都没有实际执行(它完全被跳过).

有用的部分CAS RBS是主体权限,其使用; 当然,您的UI应该验证对功能的访问权限,但是您可以(在您的低位逻辑中):

[PrincipalPermission(SecurityAction.Demand, Role = "ADMIN")]
static void DeleteOrder(int id) { ... }
Run Code Online (Sandbox Code Playgroud)

这将在完全信任的情况下得到执行; 您可以通过实现IPrincipal(查看IsInRole())来定义自己的主体(与用户绑定).由于大多数环境(winforms,webforms,mvc,wcf等)都支持主体,因此可以非常灵活地在业务层重复检查安全性,而无需引用特定的安全模型.请注意,上述检查适用于任何环境.

您也可以使用它来驱动您的UI.我确实有一个usenet帖子,启用/禁用基于主体的winforms控件(使用运行时属性来指定每个控件的角色,有点像ToolTip等) - 虽然我不能找到它(编辑:也许这一个)).

  • AFAIK,PrincipalPermission不属于CAS,而是属于基于角色的安全性.CAS将信任确定置于站点管理员手中.RBS将信任决定权交给开发者.巨大的根本区别. (2认同)