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

时间:2011-12-05 16:21:49

标签: asp.net-mvc-3 security

我的网站包含一些包含一些标签的网页,在选择一个标签时,会使用AJAX调用从服务器检索其内容。每个选项卡都通过不同的控制器加载。例如,我有一个Customer页面,其中包含Products和Clients选项卡。

该网站具有不同类型的用户,具有不同的权限级别。

我想要做的是保护控制器,并且只有在登录用户有权限时才显示选项卡的内容。因此,如果未经许可的用户输入控制器的URL,则应重定向到登录页面。网址是这样的:

http://localhost/MyApp/Products/1

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

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

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

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

  3. 我想知道是否有更好的方法。

2 个答案:

答案 0 :(得分:4)

类似于罗米亚斯的建议。您可以将Authorize元属性与自定义IAuthorizationFilter过滤器结合使用。

实施“授权”元属性时,指定应具有该操作权限的用户或角色列表。这缺乏使用数据库指定用户应该访问哪个ID的能力。

这是ID-to-User映射,IAuthorizationFilter可以在其中播放。在过滤器中,您可以根据数据库检查当前用户。

示例IAuthorizationFilter及其用法可在以下页面找到:

http://geekswithblogs.net/brians/archive/2010/07/08/implementing-a-custom-asp.net-mvc-authorization-filter.aspx

答案 1 :(得分:3)

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

[Authorize(Roles = "UserType1")]

您还可以扩展“授权”过滤器以添加自己的逻辑。 在这里,您可以看到扩展授权过滤器的示例:https://stackoverflow.com/a/428266/7720