在C#中编写自定义属性,如ASP.Net MVC Authorize属性

时间:2009-07-29 12:46:21

标签: c# asp.net-mvc wcf attributes

我喜欢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属性来装饰我的方法吗?此属性将接受参数并将决定当前用户是否有权执行该功能?

谢谢&问候, 阿贾伊

4 个答案:

答案 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中的作用),那么您将无法检查您的属性。