像ASP.Net MVC Authorize属性一样在C#中编写自定义属性

像ASP.Net MVC Authorize属性一样在C#中编写自定义属性,c#,asp.net-mvc,wcf,attributes,C#,Asp.net Mvc,Wcf,Attributes,我喜欢ASP.NETMVC授权属性,我可以扩展它,构建自己的逻辑,并用它装饰我的控制器。但是, 在我的体系结构中,我有一个公共服务层(C#类库)。最终用户可以通过ASP.NETMVC网站或通过我公开的RESTWCFWebService层访问我的应用程序。 我的asp.net MVC应用程序和REST WCF服务层都依次访问我的公共服务层 我希望授权发生在这个公共服务层,而不是ASP.NETMVC控制器或我公开的REST服务层 我可以创建ASP.NETMVC Authorize属性之类的东西来装饰

我喜欢ASP.NETMVC授权属性,我可以扩展它,构建自己的逻辑,并用它装饰我的控制器。但是,

在我的体系结构中,我有一个公共服务层(C#类库)。最终用户可以通过ASP.NETMVC网站或通过我公开的RESTWCFWebService层访问我的应用程序。 我的asp.net MVC应用程序和REST WCF服务层都依次访问我的公共服务层

我希望授权发生在这个公共服务层,而不是ASP.NETMVC控制器或我公开的REST服务层

我可以创建ASP.NETMVC Authorize属性之类的东西来装饰我在公共C#类库中的方法吗?此属性将获取参数,并决定当前用户是否有权执行该功能

谢谢和问候,
Ajay

不,AuthorizeAttribute可以工作,因为MVC框架在调用方法之前显式地调用了它。只有在客户端显式调用服务层时,服务层的类似功能才会起作用。假设即使是善意的客户机也会始终记住查找属性并调用它,这是不合理的。您应该使用该属性,而不是编写自己的属性。

这应该不太难做到-有几个地方可以反映属性并相应地处理它:

  • 在Global.asx中启动应用程序时,您可以自定义视图的路由和位置

  • 底层ASP.Net请求事件仍会触发,因此您可以覆盖其中一个事件

  • 创建自己的基本控制器并覆盖执行的操作


更新以下评论

啊,我明白了。在这种情况下,如果你直接打电话,那么你应该退房,我想这也涵盖了你的意思

或者,只要您使用某种工厂模式,定制属性就可能有意义——然后获取工厂的反射调用可以检查属性


如果您没有使用反射来检索类或调用方法(这在MVC中基本上就是路由所做的),那么您就没有机会检查属性。

您要查找的内容可以使用AOP库实现,如PostSharp()。它比在mvc中使用Authorize属性更复杂,但仍然非常简单。

另一种处理方法是在服务层中使用
[PrincipalPermission]
属性。这可以防止调用方在没有定义授权的情况下执行方法(或访问整个类)。

如果我在REST API中放入授权逻辑,那么我也必须在控制器中复制它。这就是为什么我需要在服务层做一些事情(不是WCF,只是c#类库),您不必复制任何东西。WCF和ASP.NET都会告诉您谁已连接。你只需要把这转化为他们能做的。这段代码可以共享。我只想说,你不应该用自定义属性来做。使用框架中已经内置的东西。如果他决定添加另一个前端怎么办?他将不得不再次写出所有这些属性。如果他改变了一些规则,比如允许哪些组调用一个方法呢?他将不得不改变所有的前端。有可能创建这样一个属性(使用aop),我相信Ajay应该这样做,因为只有这样,他才能确保所有前端的授权是一致的,并且他可以安全地添加另一个前端,而不关心所有前端通用的授权内容……maciejkow:我不建议使用属性。我建议使用内置的身份管理和共享身份->权限代码。如果您认为我建议不止一次地编写任何内容,请重新阅读我编写的内容。在ASP.Net MVC中,我可以这样做,我需要在C#类库中执行相同的操作,以便调用C#方法的任何人都应该执行授权检查。谢谢,非常感谢。波斯夏普看起来不错。我现在正在深入研究。希望我的架构能得到很好的提升。