查询ASP.NET MVC应用程序中的访问权限的最佳实践

时间:2012-10-30 06:44:32

标签: c# asp.net-mvc-4

我正在创建一个ASP.NET MVC4应用程序,它有一个左侧菜单面板,右侧主面板将是内容面板。 (@RenderBody

菜单上的链接是根据用户的登录角色生成的。例如,具有更高访问权限的用户将在菜单上看到更多链接。这些访问权限存储在数据库中。

我有一个_Layout.cshtml页面,我的所有页面都继承自此页面。

我应如何对访问菜单进行编码,以便在登录期间仅从数据库中检索一次访问权限?之后,用户导航到的每个页面,我都不必重新查询数据库的访问权限。

我应该在访问菜单页面使用Html.RenderActionHtml.Partial吗?

3 个答案:

答案 0 :(得分:0)

您可以在“共享”文件夹中定义名为“Navigation.cshtml”的部分视图。在你的_Layout.cshtml中,你可以像

那样进行调用
<div id="left-menu">
   @Html.Partial("Navigation")
</div>

并且您的Navigation.cshtml应该看起来像

@if(Request.IsAuthenticated) {
  // show links for authenticated user.
}
else {
 // show links for non-authenticated user.  
}

答案 1 :(得分:0)

RenderAction的想法在逻辑上是正确的。只需将OutputCache添加到VaryByCustom,您可以在其中检查角色,而不是为每个页面和用户访问数据库。

可以帮助您的链接:

答案 2 :(得分:0)

我认为最简单的方法是使用MVCSiteMapProvider,您可以使用NuGet添加到项目中。

它有一个选项securityTrimmingEnabled,它会自动删除用户无权从站点地图中查看的项目,从而从菜单中删除。

  

我应如何对访问菜单进行编码,以便在登录期间仅从数据库中检索一次访问权限?

您应该使用RoleProvider获取您的角色。如果您拥有自己的角色数据库架构,则可能需要编写自定义角色提供程序。自定义角色提供程序可以实现缓存以避免过于频繁地访问数据库,或者,只要角色不是太多,就可以使用CacheRolesInCookie属性。

然后在应该保护的控制器和操作上放置Authorize属性:

[Authorize(Roles="SomeRole")]
public ActionResult MyAction()
{
    ...
}