3

我需要一个用于业务逻辑类中的自定义授权的工具。它必须是基于权限的系统,但我无法决定如何将授权规则应用于方法。

我的第一个想法是将自定义属性应用于方法

[NeedPermission("Users", PermissionLevel.Read)]
public IList<User> GetAllUsers()
{
     // some code goes here
}

我的业务逻辑类有接口,所以我可以使用例如 Unity 拦截行为并在当前用户具有所需权限时签入运行时。如果他没有,则抛出异常。

但现在我担心这种方法的可靠性。

通常是对统一容器注入的业务逻辑类的引用。所以没有问题,因为它被配置为应用接口拦截机制。

但是如果一些开发人员会直接实例化我的业务逻辑类呢?然后不会应用拦截,即使当前用户没有执行某些操作的权限,甚至他没有经过身份验证,他也可以调用任何方法。

也有人可以更改统一容器配置,完全关闭拦截扩展。我的授权系统再次不起作用。


我看到 ASP .NET MVC 正在使用类似的授权机制。仅当请求通过标准方式 (IController.Execute) 来时,才应用授权规则。我认为在这种情况下这不是问题,因为控制器的最终用户(网络用户)无法直接访问控制器类。

在我的例子中,业务逻辑的最终用户是开发前端的程序员,他可以有意或无意地搞砸事情——创建业务逻辑类的实例并调用任何方法。

你能给我什么建议?您如何处理此类问题?

谢谢你。

4

2 回答 2

1

如果您的构造函数是内部的并且您的对象是从工厂实例化的,则开发人员将无法通过错误绕过您的安全性。

如果有人真的,真的想在没有安全性的情况下创建你的对象,他仍然可以使用反射来做到这一点,但这样做是非常有意的。

于 2011-09-01T13:43:22.030 回答
1

.NET Framework 支持声明性权限验证机制,该机制不依赖于 Unity 拦截或其他“外部”AOP。为了利用这一点,您的属性必须继承自System.Security.Permissions.CodeAccessSecurityAttribute。BCL 中包含的System.Security.Permissions.PrincipalPermissionAttribute是使用此机制评估用户权限的示例。如果它不适合您的需求,那么没有什么能阻止您创建自己的属性。

于 2011-09-01T12:17:23.707 回答