ASP.NET MVC3中基于权限的授权

我正在将ASP.NET MVC添加到现有的WebForms应用程序中.目前,我不关心身份验证/登录,因为这部分是由现有代码(Forms身份验证)处理的.

在现有的WebForms应用程序中,我们每页都有一个完全自定义的基于权限的授权.因此,每个用户都有一组权限,列出了他允许访问的页面.
现在我需要决定如何使用相同的权限系统来限制对特定MVC控制器和操作的访问.

据我所知,对于ASP.NET MVC,有一个标准的AuthorizeAttribute,我可以在其中指定角色.我还发现了一些建议指定权限而不是角色的文章 – 然后可以做这样的事情:

[CustomAuthorize(Roles = "View products,Edit products")]

通过扩展AuthorizeAttribute,我还可以定义如何存储和访问权限.

这个解决方案对我来说是可以接受的(虽然改变角色的语义有点味道).
但在承诺之前,我想看看还有其他选择.这就是我被困的地方 – 我还没有找到关于ASP.NET MVC中授权的不同方法的全面概述.我还想知道所有安全概念(如表单身份验证,成员资格提供程序,授权属性,IPrincipal等)是如何相互关联以及它们应如何协同工作的.

解决方法

首先要了解的是,与Webforms非常相似,MVC中有一个管道.每个请求都经过多种方法,并且在您可以“挂钩”并执行操作的过程中有一些扩展点.

所有AuthorizeAttribute都挂钩到OnAuthorization扩展点,并根据您提供给它的条件(用户名,角色等)决定是否给某人访问权限.

这是一个例子:http://geekswithblogs.net/brians/archive/2010/07/08/implementing-a-custom-asp.net-mvc-authorization-filter.aspx

您可以创建自己的自定义授权属性,并使用自己的条件执行完全相同的操作.您无需重新使用Roles参数,您可以根据需要创建自己的所有参数.

这是MVC更喜欢的方法.另一个好处是,如果你也把它作为过滤器,那么你可以将它添加到全局过滤器,并让它适用于所有你想要的东西.

你基本上还有两个合理的选择.在Application_AuthenticateRequest中实现global.asax中的处理程序(不推荐)或创建一个覆盖OnAuthorize的公共BaseController(Attribute挂钩相同的东西,但在不同的地方).

很多人尝试使用Session变量进行身份验证,这只是最糟糕的事情.

由于我们对您的身份验证和权限系统一无所知,我们所能做的就是提供一般性建议.

相关文章

项目要求通过网站上传大文件,比如视频文件,通过摸索实现了文件分片来上传,然后后台进行合并。 使用了...
安装新版本的Nginx(vim /etc/yum.repos.d/nginx.repo) [nginx-stable] name=nginx stable repo baseu...
什么是 SignalR ASP.NET Core ASP.NET Core SignalR 是一种开放源代码库,可简化将实时 web 功...
在Windows下使用Docker,我们选择Docker Desktop这个软件,非常方便。 ## Docker Desktop介绍及安装 Do...
项目开始设计的是运行在windows下,所以一开始采用的是windows服务模式来获取多媒体文件信息,后来要求...
银河麒麟高级服务器操作系统V10是针对企业级关键业务,适应虚拟化、云计算、大数据、工业互联网时代对主...