2011-12-05 64 views
4

我有一个包含一些标签,并选择一个的时候,它的内容是通过一个AJAX调用服务器检索页面的网站。每个选项卡都通过不同的控制器加载。例如,我有一个包含产品和客户端选项卡的客户页面。限制访问控制方法在ASP.NET MVC 3

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

我想要做的就是保护控制器,并且只有当登录用户有权限时才显示选项卡的内容。所以如果没有权限的用户输入控制器的url,它应该重定向到登录页面。 url是这样的:

http://localhost/MyApp/Products/1 

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

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

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

  2. 在每次请求的产品控制,我会使用记录的ID,以检查用户是否有权访问它使数据库查询。但是这意味着对于每个请求我都需要运行额外的查询。

我想知道是否有更好的方法来做到这一点。

回答

4

与Romias建议的类似。您可以将Authorize元属性与定制的IAuthorizationFilter过滤器结合使用。

当你实现你指定的用户或角色应有权采取行动的列表授权元属性。这缺乏使用数据库来指定用户应该访问哪个ID的能力。

正是这个ID到用户映射,其中的个IAuthorizationFilter也发挥了作用。在过滤器中,您可以根据数据库检查当前用户。

样品个IAuthorizationFilter和它的使用可以在以下网页上找到:

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

+0

+1 – Romias

3

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

[Authorize(Roles = "UserType1")] 

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

+0

如果没有自订个IAuthorizationFilter,设置角色,甚至用户将无法正常工作。为了过滤基于你既需要授权属性以及自定义个IAuthorizationFilter的ID。示例链接为 –