【问题标题】:How to restrict allowable callers of a method?如何限制方法的允许调用者?
【发布时间】:2014-05-09 10:41:00
【问题描述】:

在 C# 4.0+ 中,有没有一种好方法可以根据方法属性限制方法的允许调用者?

我天真地认为这就是 CAS 的全部意义所在——而现在 .NET 4.0 中的变化似乎表明新的 CAS 仅适用于程序集级别,并且仅适用于沙盒应用程序……这不是什么我在追。

我在想象这样的事情:

[MyDangerousPermission]
public void DoSomethingDangerous()
{
    . . .
}

在另一个类或程序集中:

[MyDangerousDemand]
public void AllowedCaller()
{
    DoSomethingDangerous();
}

如果没有[MyDangerousDemand] 调用堆栈中的某个位置,任何对DoSomethingDangerous() 的调用都会失败(例如,抛出SecurityException)。

不可能?

(我的主要应用程序在一个网络应用程序中,以防万一)。

【问题讨论】:

  • CAS 从来不是为了保护 Web 应用程序,它旨在防止您不信任的代码。允许用户将代码上传到 Web 服务器是……不明智的。但是有可能,您当然会不信任他们上传的整个程序集,而不仅仅是一种方法。如果您不信任自己的代码,那么您将遇到更大的问题。您只是看错了角落的可能性很高。
  • 我的应用不涉及任何上传的代码;这不是我要防止的情况。

标签: c# security .net-4.0 attributes code-access-security


【解决方案1】:

我们仍然按照您的具体要求使用 CAS,并且没有遇到任何问题。看PrincipalPermissionAttribute。

但是,如果它是一个 Web 应用程序,您可能应该使用您正在使用的框架创建的属性之一。对于 ASP.NET MVC,它被称为 AuthorizeAttribute。即在顶层而不是在业务层进行授权。

【讨论】:

  • AuthorizeAttribute 不适用于此应用程序;系统只有匿名用户——没有人被“授权”。
  • 如果没有人被授权,你希望CAS如何工作?
  • 当存在“Permission”属性时,我希望它沿着调用堆栈向上走,并查看其中一个调用者是否存在匹配的“Demand”属性。这个想法是能够将敏感代码的访问权限限制在少数调用者中,主要是为了捕获编程或策略错误。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-12-03
  • 1970-01-01
  • 2014-05-21
  • 1970-01-01
相关资源
最近更新 更多