我的网站包含一些包含一些标签的网页,在选择一个标签时,会使用AJAX调用从服务器检索其内容。每个选项卡都通过不同的控制器加载。例如,我有一个Customer页面,其中包含Products和Clients选项卡。
该网站具有不同类型的用户,具有不同的权限级别。
我想要做的是保护控制器,并且只有在登录用户有权限时才显示选项卡的内容。因此,如果未经许可的用户输入控制器的URL,则应重定向到登录页面。网址是这样的:
http://localhost/MyApp/Products/1
其中1是产品的数据库ID。
我可以实现这两个解决方案,但它们都不是最佳解决方案:
使用ChildOnlyAction属性。我会使用此属性标记Product控制器的操作,并使用RenderAction从主视图渲染选项卡。但这意味着必须呈现页面上的所有选项卡,这不是最佳选择,因为我只想在用户点击选项卡时加载数据。
在每次向Product控制器发出请求时,我都会使用记录ID进行数据库查询,以检查用户是否有权访问它。但这意味着对于每个请求,我都必须运行额外的查询。
我想知道是否有更好的方法。
答案 0 :(得分:4)
类似于罗米亚斯的建议。您可以将Authorize元属性与自定义IAuthorizationFilter过滤器结合使用。
实施“授权”元属性时,指定应具有该操作权限的用户或角色列表。这缺乏使用数据库指定用户应该访问哪个ID的能力。
这是ID-to-User映射,IAuthorizationFilter可以在其中播放。在过滤器中,您可以根据数据库检查当前用户。
示例IAuthorizationFilter及其用法可在以下页面找到:
答案 1 :(得分:3)
您是否尝试过使用授权过滤器来装饰您想要保护的控制器?
[Authorize(Roles = "UserType1")]
您还可以扩展“授权”过滤器以添加自己的逻辑。 在这里,您可以看到扩展授权过滤器的示例:https://stackoverflow.com/a/428266/7720