ASP.NET MVC 3中限制访问控制器方法

4
我有一个网站,其中一个页面包含一些选项卡,当选择其中一个选项卡时,它的内容会通过 AJAX 调用从服务器检索。每个选项卡都是通过不同的控制器加载的。例如,我有一个客户页面,其中包含产品和客户选项卡。
该网站有不同类型的用户,具有不同的权限级别。
我想要做的是保护控制器,并仅在已登录用户具有权限时显示选项卡的内容。因此,如果没有权限的用户输入控制器的 URL,则应重定向到登录页面。URL 如下:
http://localhost/MyApp/Products/1

其中1是产品的数据库ID。

我可以实现这两个解决方案,但它们都不是最优解:

  1. 使用ChildOnlyAction属性。我会在Product控制器的操作中标注此属性,并使用RenderAction从主视图呈现选项卡。但这意味着必须呈现页面上的所有选项卡,这并不是最优的,因为我只想在用户单击选项卡时加载数据。

  2. 对于Product控制器的每个请求,我将使用记录的ID进行数据库查询,以检查用户是否有权限访问它。但这意味着对于每个请求,我都必须运行额外的查询。

我想知道是否有更好的方法来解决这个问题。

2个回答

4
与Romias所建议的类似,您可以将Authorize元属性与自定义IAuthorizationFilter过滤器相结合使用。当您实现Authorize元属性时,您会指定应该具有对该操作的许可权限的用户或角色列表。这缺乏使用数据库指定哪些ID的用户应该访问的能力。在IAuthorizationFilter中,就是用于进行当前用户与数据库之间的ID到用户映射检查的过滤器。以下页面提供了一个示例IAuthorizationFilter及其用法:http://geekswithblogs.net/brians/archive/2010/07/08/implementing-a-custom-asp.net-mvc-authorization-filter.aspx

3

你是否尝试过使用授权过滤器来装饰你想要保护的控制器?

[Authorize(Roles = "UserType1")]

您还可以扩展Authorize过滤器以添加自己的逻辑。 以下是扩展Authorize过滤器的示例: https://dev59.com/iHRC5IYBdhLWcg3wCMrX#428266


没有自定义的IAuthorizationFilter,设置角色甚至用户也无法工作。为了根据ID进行过滤,您需要同时使用Authorize属性和自定义的IAuthorizationFilter。 - Nick Bork

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接