我喜欢ASP.Net MVC Authorize属性,我可以扩展它并构建我自己的逻辑并用它来装饰我的控制器。但
在我的架构中,我有一个公共服务层(C#类库)。最终用户可以通过ASP.Net MVC网站或我公开的REST WCF Webservice层访问我的应用程序。 我的asp.net MVC应用程序和REST WCF服务层都依次访问我的公共服务层。
我希望在此公共服务层中进行授权,而不是在ASP.Net MVC Controller或我公开的REST服务层中进行授权。
我可以在常见的C#类库中创建ASP.Net MVC Authorize属性来装饰我的方法吗?此属性将接受参数并将决定当前用户是否有权执行该功能?
谢谢&问候, 阿贾伊
答案 0 :(得分:5)
您正在寻找的是使用AOP库,例如PostSharp(http://www.postsharp.org/)。它比在mvc中使用Authorize属性更复杂,但仍然非常简单。
答案 1 :(得分:2)
处理此问题的另一种方法是在服务层中使用[PrincipalPermission]
属性。这可以防止调用者在没有定义授权的情况下执行方法(或访问整个类)。
答案 2 :(得分:1)
不,AuthorizeAttribute有效,因为MVC框架在调用方法之前显式调用它。服务层的类似功能仅在客户端明确调用它时才有效。假设即使是善意的客户总是记得寻找属性并调用它也是不合理的。 WCF has its own security。你应该使用它而不是自己编写。
答案 3 :(得分:0)
这不应该太难做 - 有几个地方可以反映出属性并相应地处理它:
在Global.asx中启动应用程序时,您可以自定义视图的路由和位置
基础ASP.Net请求事件仍然会触发,因此您可以覆盖其中一个
创建您自己的基本控制器并覆盖OnActionExecuting
更新以下评论
啊,我明白了。在这种情况下,如果您正在进行直接通话,那么您应该查看Code Access Security,我认为这涵盖了您的意思。或者,只要您使用某种工厂模式,自定义属性就有意义 - 然后获得工厂的反射调用可以检查属性。
如果您没有使用反射来检索您的类或调用您的方法(这实际上是路由在MVC中的作用),那么您将无法检查您的属性。